Date.getTime() não incluindo o tempo?
Pergunta
Não consigo entender por que ocorre o seguinte:
String date = "06-04-2007 07:05";
SimpleDateFormat fmt = new SimpleDateFormat("MM-dd-yyyy HH:mm");
Date myDate = fmt.parse(date);
System.out.println(myDate); //Mon Jun 04 07:05:00 EDT 2007
long timestamp = myDate.getTime();
System.out.println(timestamp); //1180955100000 -- where are the milliseconds?
// on the other hand...
myDate = new Date();
System.out.println(myDate); //Tue Sep 16 13:02:44 EDT 2008
timestamp = myDate.getTime();
System.out.println(timestamp); //1221584564703 -- why, oh, why?
Solução
Que milissegundos?Você está fornecendo informações de apenas minutos no primeiro exemplo, enquanto o segundo exemplo obtém a data atual do sistema em milissegundos. O que você está procurando?
String date = "06-04-2007 07:05:00.999";
SimpleDateFormat fmt = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss.S");
Date myDate = fmt.parse(date);
System.out.println(myDate);
long timestamp = myDate.getTime();
System.out.println(timestamp);
Outras dicas
concordo com acima, não deve haver milissegundos...
Porque o formato de data simples que você especificou descarta os milissegundos.Portanto, o objeto Date resultante não possui essa informação.Então, quando você imprime, são todos 0s.
Por outro lado, o objeto Date retém os milissegundos quando você atribui a ele um valor com milissegundos (neste caso, usando new Date()).Então, quando você os imprime, ele também contém milissegundos.
Em vez de usar as bibliotecas Sun JDK Time/Date (que deixam muito a desejar), recomendo dar uma olhada em http://joda-time.sourceforge.net.
Este é um projeto sourceforge muito maduro e ativo e possui uma API muito elegante.
Quando você analisa uma data, ela usa apenas as informações que você fornece.Neste caso ele só conhece MM-dd-aaaa HH:mm.
A criação de um novo objeto de data retorna a data/hora atual do sistema (número de milissegundos desde a época).
toString() de um objeto Date não mostra os milissegundos...Mas eles estão lá
Então new Date() é um objeto com resolução de milissegundos, como pode ser visto por:
System.out.printf( "ms = %d\n", myDate.getTime() % 1000 ) ;
No entanto, quando você constrói sua data com SimpleDateFormat, nenhum milissegundo é passado para ela
Estou perdendo a pergunta aqui?
[editar] Hahaha...muito lento;)
Date.getTime retorna o número de milissegundos desde 1º de janeiro de 1970, 00:00:00 GMT representado pelo objeto Date.Portanto, "06-04-2007 07:05" - "01-01-1970 00:00" é igual a 1180955340000 milissegundos.Como a única preocupação da sua pergunta é sobre a parte da hora da data, uma maneira aproximada de pensar nesse cálculo é o número de milissegundos entre 07h05 e 00h00, que é 25500000.Isso é divisível por 1000, pois nenhum dos tempos tem milissegundos.
Na segunda data ele usa a hora atual em que aquela linha de código é executada.Isso usará todos os milissegundos atuais após o segundo atual no cálculo.Portanto, Date.getTime provavelmente retornará um número que não é divisível por 1000.
O getTime()
método de Date
retorna o número de milissegundos desde 1º de janeiro de 1970 (esta data é chamada de "época" porque todas as datas do computador são baseadas nesta data).Deveria não ser usado para exibir uma versão legível da sua data.
Use o SimpleDateFormat.format()
método em vez disso.Aqui está uma versão revisada de parte do seu código que acho que pode resolver o seu problema:
String date = "06-04-2007 07:05:23:123";
SimpleDateFormat fmt = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss:S");
Date myDate = fmt.parse(date);
System.out.println(myDate); //Mon Jun 04 07:05:23 EDT 2007
String formattedDate = fmt.format(myDate);
System.out.println(formattedDate); //06-04-2007 07:05:23:123
import java.util.*;
public class Time {
public static void main(String[] args) {
Long l = 0L;
Calendar c = Calendar.getInstance();
//milli sec part of current time
l = c.getTimeInMillis() % 1000;
//current time without millisec
StringBuffer sb = new StringBuffer(c.getTime().toString());
//millisec in string
String s = ":" + l.toString();
//insert at right place
sb.insert(19, s);
//ENJOY
System.out.println(sb);
}
}