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?
Foi útil?

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);
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top