example - new icon java
Formato instantáneo a cadena (4)
Zona horaria
Para formatear un Instant
time-zone se requiere una time-zone . Sin una zona horaria, el formateador no sabe cómo convertir el instante en campos humanos de fecha y hora, y por lo tanto arroja una excepción.
La zona horaria se puede agregar directamente al formateador usando withZone()
.
DateTimeFormatter formatter =
DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT )
.withLocale( Locale.UK )
.withZone( ZoneId.systemDefault() );
Generando cadena
Ahora usa ese formateador para generar la representación de Cadena de tu Instantáneo.
Instant instant = Instant.now();
String output = formatter.format( instant );
Volcado a la consola.
System.out.println("formatter: " + formatter + " with zone: " + formatter.getZone() + " and Locale: " + formatter.getLocale() );
System.out.println("instant: " + instant );
System.out.println("output: " + output );
Cuando se ejecuta.
formatter: Localized(SHORT,SHORT) with zone: US/Pacific and Locale: en_GB
instant: 2015-06-02T21:34:33.616Z
output: 02/06/15 14:34
Estoy tratando de formatear un Instantáneo a una Cadena usando la nueva java 8 time-api y un patrón:
Instant instant = ...;
String out = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(instant);
Usando el código anterior, recibo 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)
...
La clase Instant
no contiene información de zona, solo almacena la marca de tiempo en milisegundos desde UNIX epoch, es decir, 1 de enero de 1070 desde UTC. Por lo tanto, el formateador no puede imprimir una fecha porque la fecha siempre se imprime para la zona horaria concreta. Debe configurar la zona horaria para formatear y todo estará bien, así:
Instant instant = Instant.ofEpochMilli(92554380000L);
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(Locale.UK).withZone(ZoneOffset.UTC);
assert formatter.format(instant).equals("07/12/72 05:33");
assert instant.toString().equals("1972-12-07T05:33:00Z");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");
String text = date.toString(formatter);
LocalDate date = LocalDate.parse(text, formatter);
Creo que esto podría ayudar, es posible que necesite usar algún tipo de variación de fecha local en lugar de instantánea
public static void main(String[] args) {
DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
.withZone(ZoneId.systemDefault());
System.out.println(DATE_TIME_FORMATTER.format(new Date().toInstant()));
}