1. Información general
En este tutorial rápido, veremos cómo convertir un ZonedDateTime en un String.
También veremos cómo analizar un ZonedDateTime desde un String.
2. Creación de un ZonedDateTime
Primero, comenzaremos con un ZonedDateTime con una zona horaria de UTC. Hay varias formas de lograrlo.
Podemos especificar el año, mes, día, etc:
ZonedDateTime zonedDateTimeOf = ZonedDateTime.of(2018, 01, 01, 0, 0, 0, 0, ZoneId.of("UTC"));
También podemos crear un ZonedDateTime a partir de la fecha y hora actual:
ZonedDateTime zonedDateTimeNow = ZonedDateTime.now(ZoneId.of("UTC"));
O podemos crear un ZonedDateTime a partir de un LocalDateTime existente :
LocalDateTime localDateTime = LocalDateTime.now(); ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.of("UTC"));
3. ZonedDateTime a cadena
Ahora, convierta nuestro ZonedDateTime en una cadena. Para esto, usaremos la clase DateTimeFormatter .
Hay algunos formateadores especiales que podemos usar para mostrar datos de zona horaria. La lista completa de formateadores se puede encontrar aquí, pero veremos algunos de los más comunes.
Si queremos mostrar el desplazamiento de la zona horaria, podemos usar el formateador "Z" o "X" :
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy - HH:mm:ss Z"); String formattedString = zonedDateTime.format(formatter);
Esto nos daría un resultado como este:
02/01/2018 - 13:45:30 +0000
Para incluir el nombre de la zona horaria, podemos usar una "z" minúscula:
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("MM/dd/yyyy - HH:mm:ss z"); String formattedString2 = zonedDateTime.format(formatter2);
El resultado de esto sería:
02/01/2018 - 13:45:30 UTC
4. Cadena a ZonedDateTime
Este proceso también puede funcionar a la inversa. Podemos tomar una cadena y convertirla nuevamente en un ZonedDateTime .
Una opción para hacer esto es usar el método parse () estático de la clase ZonedDateTime :
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2011-12-03T10:15:30+01:00");
Este método utiliza el formateador ISO_ZONED_DATE_TIME . También hay una versión sobrecargada del método que toma un parámetro DateTimeFormatter . Sin embargo, la cadena debe contener un identificador de zona o obtendremos una excepción:
assertThrows(DateTimeParseException.class, () -> ZonedDateTime.parse("2011-12-03T10:15:30", DateTimeFormatter.ISO_DATE_TIME));
Una segunda opción para obtener un ZonedDateTime a partir de un String implica 2 pasos: convertir el String en un LocalDateTime, luego este objeto en un ZonedDateTime:
ZoneId timeZone = ZoneId.systemDefault(); ZonedDateTime zonedDateTime = LocalDateTime.parse("2011-12-03T10:15:30", DateTimeFormatter.ISO_DATE_TIME).atZone(timeZone); log.info(zonedDateTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
Este método indirecto simplemente combina la fecha y hora con un ID de zona:
INFO: 2011-12-03T10:15:30+02:00[Europe/Athens]
Para obtener más información sobre cómo analizar cadenas en fechas, consulte nuestro artículo sobre análisis de fechas más detallado.
5. Conclusión
En este artículo, hemos visto cómo crear un ZonedDateTime y cómo formatearlo como una cadena.
También hemos echado un vistazo rápido a cómo analizar una cadena de fecha y hora y convertirla en un ZonedDateTime .
El código fuente de este tutorial está disponible en Github.