Estou tentando formatar um Instant para uma String usando o novo java 8 time-api e um padrão:
Instant instant = ...;
String out = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(instant);
Usando o código acima, recebo uma exceção que reclama um campo não suportado:
java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra
at java.time.Instant.getLong(Instant.java:608)
at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
...
yyyy-MM-dd hh:mm:ss
formato:DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss").withZone(ZoneId.of("Europe/Paris"));
fonte
Isso evita que você precise converter para o UTC. No entanto, algumas estruturas de tempo de outro idioma podem não suportar milissegundos, portanto, você deve
fonte
A
Instant
classe não contém informações da Zona, apenas armazena o registro de data e hora em milissegundos da época UNIX, ou seja, 1 de janeiro de 1070 da UTC. Portanto, o formatador não pode imprimir uma data porque a data sempre é impressa para fuso horário concreto. Você deve definir o fuso horário como formatador e tudo ficará bem, assim:fonte
Ou se você ainda deseja usar o formatador criado a partir do padrão, basta usar LocalDateTime em vez de Instant:
fonte
Os instantes já estão no UTC e já possuem um formato de data padrão aaaa-MM-dd . Se você está satisfeito com isso e não quer mexer com fusos horários ou formatação, você também pode
toString()
:Não quer o T e Z? (Z indica que esta data é UTC. Z significa "Zulu", também conhecido como "Desvio de hora zero", também conhecido como UTC):
Deseja milissegundos em vez de nanossegundos? (Para que você possa inseri-lo em uma consulta sql):
etc.
fonte
Acredito que isso possa ajudar, talvez você precise usar algum tipo de variação de data local em vez de instantes
fonte