Estoy tratando de formatear un Instant a una Cadena usando la nueva API de tiempo de Java 8 y un patrón:
Instant instant = ...;
String out = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(instant);
Usando el código anterior, obtengo una excepción que se queja de un campo no compatible:
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"));
fuente
Esto le ahorra tener que convertir a UTC. Sin embargo, los marcos de tiempo de otros idiomas pueden no ser compatibles con los milisegundos, por lo que debe hacerlo
fuente
La
Instant
clase no contiene información de zona, solo almacena la marca de tiempo en milisegundos de la época UNIX, es decir, el 1 de enero de 1070 de UTC. Entonces, el formateador no puede imprimir una fecha porque la fecha siempre se imprime para la zona horaria concreta. Debe configurar la zona horaria en formateador y todo estará bien, así:fuente
O si aún desea usar el formateador creado a partir del patrón, puede usar LocalDateTime en lugar de Instant:
fuente
Los instantes ya están en UTC y ya tienen un formato de fecha predeterminado de aaaa-MM-dd . Si está contento con eso y no quiere meterse con las zonas horarias o el formato, también podría
toString()
:¿No quieres la T y la Z? (Z indica que esta fecha es UTC. Z significa "Zulu", también conocido como "Compensación de hora cero", también conocido como UTC):
¿Quieres milisegundos en lugar de nanosegundos? (Para que pueda colocarlo en una consulta SQL):
etc.
fuente
Creo que esto podría ayudar, es posible que deba usar algún tipo de variación de fecha local en lugar de instantánea
fuente