Dúvida com método setTime(Long timeInMillis) [ RESOLVIDO ]

Gostaria de saber uma coisa.
Eu sei que um milissegundo (1000) equivale a 1 segundo.
Daí eu montei o código abaixo:

Date date = new Date();
date.setTime(1000);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
//esta linha deveria mostrar-me como resultado: "00:00:01"
System.out.println("Resultado: "+sdf.format(date));

O pedaço de código deveria exibir o seguinte resultado: “00:00:01”
Porém, tudo o que ele mostra é: “21:00:01”

Resumindo, ele mostra o meu um segundo, mas ele mostra a hora junto, sendo que eu não setei hora.
Eu tentei o seguinte também:

Time time = new Time(1000);
System.out.println(time);

Mas ele mostrou a mesma coisa, mas creio por que seja filho de Date.
Se eu quisesse mostrar só 00:00:01 como resultado, o que eu deveria fazer?
Gostaria de saber como fazer isso sem usar o JodaTime. Vlw.

Se você imprimir o resto de java.util.Date que você setou desse jeito, vai ver que a data também é estranha:

31 de dezembro de 1969, às 21:00:01, time zone = Brasil/São Paulo.

Ou seja, você só teria o resultado esperado se mandasse imprimir o java.util.Date usando um timezone UTC (porque Brasil/São Paulo é UTC - 03:00:00 fora do horário de verão).

Ou seja, você precisa usar o Joda-Time para o que você quer fazer.

Viu entanglement, é verdade o que você falou, dessa forma que eu fiz ele coloca uma data estranha. É que no meu caso essa parte da data( dia, mês e ano) eu não vou
usar, porque só preciso do cálculo de horas mesmo. Mas é engraçado. Isso pode ser considerado um Bug do Java? Pois quando eu tenho um outro valor qualquer em milissegundos,
quando digo completo refiro-me a meu valor em milissegundos com os campos hora, minuto e segundo preenchidos, o java mostra a hora corretamente. Porém, quando o valor
em milissegundos não possui a informação de hora, o que acontece é que o cálculo acaba saindo estranho.

Fala ae,

Tenta usa a classe Calendar:

Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 1);
Date dat = new Date(cal.getTimeInMillis());
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");   
System.out.println("Resultado: "+ sdf.format(dat));

Flw

Alex

Fala alexfmjr, tudo beleza?
Assim funciona. O problema é que eu não posso travar a hora em meu programa. Ele vai receber o tempo em milissegundos e converter.
Esse tempo pode ter um segundo, um minuto ou várias horas. O negócio é usar o JodaTime e não reinventar a roda. Como o próprio
autor do JodaTime diz:

O negócio é importar o jarzinho do Joda e ser feliz, rsrsrs
Abraço a todos.

Favor olhar a documentação do Java para saber o que um método faz ou deixa de fazer:

[quote]public void setTime(long time)

Sets this Date object to represent a point in time that is [i]time[/i] milliseconds after January 1, 1970 00:00:00 GMT. 

[/quote]

Em português, o long que você passa é o número de milisegundos desde 1º de Janeiro de 1970, no horário do meridiano de greenwich.

A data que você viu então vai ficar 01/01/1970 21:00:01, horário de Brasília (GMT -3)

Não, isso não é um bug do Java. Isso é porque você está tentando usar o java.util.Date, que representa instantes no tempo (por exemplo, a sua data de nascimento) para representar períodos de tempo, e o java.util.Date não é apropriado para esse tipo de coisas.

Só para comparar, o C# (.NET) tem duas classes diferentes - o System.DateTime e o System.TimeSpan (esse sim representa intervalos de tempo).

Subtrair 2 DateTimes resulta em um TimeSpan.

“Correção idiota”,

Esta correto o que o Bruno Laturner respondeu, a unica diferença é que depois do date.setTime(1000) a data que fica é:
31/12/1969 21:00:01 (GMT-3)

Usando o JodaTime e sendo feliz:

        Period p = new Period(1000);
        Calendar c = Calendar.getInstance();
        c.set(Calendar.HOUR, p.getHours());
        c.set(Calendar.MINUTE, p.getMinutes());
        c.set(Calendar.SECOND, p.getSeconds());

        Time t = new Time(c.getTimeInMillis());
        System.out.println("TEMPO: "+t);

Assim funciona!!!
Vlw!

[quote=alexfmjr]“Correção idiota”,

Esta correto o que o Bruno Laturner respondeu, a unica diferença é que depois do date.setTime(1000) a data que fica é:
31/12/1969 21:00:01 (GMT-3)[/quote]

Opps, brigado pela correção.

[quote=oddy.silva]Usando o JodaTime e sendo feliz:

        Period p = new Period(1000);
        Calendar c = Calendar.getInstance();
        c.set(Calendar.HOUR, p.getHours());
        c.set(Calendar.MINUTE, p.getMinutes());
        c.set(Calendar.SECOND, p.getSeconds());

        Time t = new Time(c.getTimeInMillis());
        System.out.println("TEMPO: "+t);

Assim funciona!!!
Vlw!

[/quote]

Com JodaTime, sendo feliz de verdade:

Time t = new Time(new DateTime().plus(1000).getMillis());

ou 

Time t = new Time(new DateTime().plusSeconds(1).getMillis());

Eu vi aqui, no meu caso isso não se aplica, pois soma 1 segundo ao tempo atual.
No meu caso, tenho um longo e preciso transformá-lo em hora (HH:mm:ss), contando
a partir do nada. O meu código anterior ainda sofre variações de acordo com a hora do
dia, mas já é um avanço!!!

Não entendi esse “long contando a partir do nada”. São milisegundos a partir de uma data específica, ou a contagem que o Java usa a partir do zero?

rsrsrsrs, verdade, a partir do nada só o Chuck Norris

Seria a partir do zero do Java mesmo.