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

13 respostas
oddy.silva

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.

13 Respostas

E

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.

oddy.silva

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.

A

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

oddy.silva

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.

B

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

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.

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)

E

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.

A

“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)

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!

B

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)

Opps, brigado pela correção.

B

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!

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());
oddy.silva

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!!!

B

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?

oddy.silva

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

Seria a partir do zero do Java mesmo.

Criado 1 de outubro de 2009
Ultima resposta 1 de out. de 2009
Respostas 13
Participantes 4