Pergunta

Eu quero salvar um objeto Date para uma string legível (por exemplo 22/10/2009 21:13:14) que também está de volta parsable para um objeto Date.

Eu tentei muitas coisas e o melhor que eu poderia encontrar era usar DateFormater para análise e formatação, mas tem um revés. Quando você formatar uma data você perde segundos informações. Tentei descobrir se existe uma opção para formatá-lo e exibir os segundos (mesmo melhor seria o nível de milissegundo já que é a resolução do objeto Date permite que você tenha), mas eu veio acima do short.

Todas as idéias?

Foi útil?

Solução

Dê uma olhada java.text.SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss.SSS");
Date dt = new Date();
String S = sdf.format(dt); // formats to 09/23/2009 13:53:28.238
Date dt2 = sdf.parse(S); // parses back

Outras dicas

SimpleDateFormat pode formatar e analisar uma data com base em um sistema padrão muito simples que incluem segunda e até mesmo milissegundos.

Outras respostas são todos bons.

Mas ao fazer esse tipo de coisa por favor escolher um formato que Classifica corretamente quando codificado como uma cadeia .... "aaaa / MM / DD HH: mm: ss" está bem. Ele sempre me surpreende quando engenheiros de software escolher um formato de data que não faz tipo de forma óbvia, conveniente.

Você vai economizar seus desenvolvedores companheiros muita dor em algum ponto distante no futuro - pense nisso como um bom karma: -)

Um pouco off-topic, mas eu sempre sinto a necessidade de lembrar as pessoas que DateFormat e SimpleDateFormat não são thread-safe! A documentação Sun afirma claramente isso, mas eu continuo achando código para fora no selvagem onde as pessoas furar um SimpleDateFormat em uma estática ...

ISO 8601

Use formato ISO 8601 .

  • É flexível, que inclui segundos e fração de segundo, se houver algum, mas você também pode deixá-los se eles são 0.
  • É de padrão, de modo mais e formato mais ferramentas e analisá-lo. Ótimo para serialização para armazenamento ou intercâmbio de dados.
  • É assim 2009-10-22T21:13:14, devo dizer que é muito legível (embora o T no meio que denota o início da parte do tempo pode se sentir estranho à primeira).
  • As cordas tipo corretamente, como mikera solicitado na outra resposta , desde que os anos estão nos quatro dígitos gama a partir de 1000 até 9999.
  • As classes de java.time, o moderno Java data e hora API, bem como aqueles de Joda tempo de análise ISO 8601 como seu padrão, ou seja, sem qualquer formatador explícito, e produzir o mesmo formato de seus métodos toString.

Uma demonstração modesta de usar java.time:

LocalDateTime dateTime = LocalDateTime.of(2009, 10, 22, 21, 13, 14);
String readableString = dateTime.toString();
System.out.println(readableString);
LocalDateTime parsedBack = LocalDateTime.parse(readableString);
System.out.println(parsedBack);

Este imprime duas linhas idênticas:

2009-10-22T21:13:14
2009-10-22T21:13:14

A chamada System.out.println() último implicitamente chama toString() mais uma vez, de modo que este não deve surpresa.

Se você quiser fazê-lo um pouco mais simples, e ser poupado de fazer o seu próprio DateFormat que a maioria das outras respostas envolvem, você pode aproveitar o formato padrão em java.time.Instant :

(new Date()).toInstant.toString();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top