1. ZonedDateTime
clase
Hay otra clase muy interesante en la API de fecha y hora: la ZonedDateTime
clase. Su objetivo principal es facilitar el trabajo con fechas en diferentes zonas horarias.
LocalDate
es genial para representar fechas. Por ejemplo, cumpleaños. Mi cumpleaños es el 15 de marzo, no importa dónde esté. Este es un ejemplo de una fecha.
LocalTime
es genial para describir la hora, como la hora puesta en un despertador: puse la alarma a las 5:00 am y no importa dónde esté. 5:00 am es 5:00 am. Este es un ejemplo de trabajar con el tiempo.
Ahora digamos que estamos escribiendo una aplicación que reserva vuelos. Los aviones despegan y llegan según la hora local. El avión está en el aire durante un tiempo fijo, pero las zonas horarias pueden cambiar.
Zonas horarias
Por cierto, las zonas horarias son un verdadero desastre. Y si crees que hay 24 husos horarios, estás muy equivocado.
Por ejemplo, la hora en la India difiere de la hora del meridiano de Greenwich en cinco horas y media: GMT+5:30
. Algunos países cambian al horario de verano y otros no. Además, los diferentes países cambian al horario de verano en diferentes épocas del año.
Y algunos países aprueban leyes que cancelan el horario de verano, lo reintroducen o lo cancelan nuevamente.
En cualquier caso, el mundo tiene zonas horarias, y dentro de cada zona horaria hay una hora. El tiempo en diferentes zonas puede coincidir durante ciertos períodos del año y luego diferir durante otros períodos. Las zonas horarias generalmente reciben el nombre de las principales ciudades ubicadas en ellas: Europe/Monaco
, Asia/Singapore
, pero también hay excepciones: US/Pacific
.
Oficialmente, hay 599 zonas horarias en este momento. Piénselo: 599. Eso está lejos de 24. Bienvenido al mundo global.
La ZoneId
clase del java.time
paquete se usa para almacenar una zona horaria en Java.
Por cierto, tiene un getAvailableZoneIds()
método estático, que devuelve el conjunto de todas las zonas horarias conocidas actualmente. Para obtener una lista de todas las zonas, debe escribir el siguiente código:
Código | Salida de consola (parcial) |
---|---|
|
|
Para obtener un ZoneId
objeto por su nombre, debe usar el of()
método estático;
Código | Nota |
---|---|
|
|
2. Crear un ZonedDateTime
objeto
Al crear un ZonedDateTime
objeto, debe llamar al now()
método estático de la clase y pasarle un ZoneId
objeto.
Código | Salida de consola |
---|---|
|
|
Si no pasa un ZoneId
objeto al now()
método (y eso está permitido), la zona horaria se determina automáticamente según la configuración de la computadora que ejecuta el programa.
Ejemplo:
Código | Salida de consola |
---|---|
|
|
Conversión de una fecha global a una local
Una de las características interesantes de ZonedDateTime
es su capacidad para convertir a una fecha y hora locales. Ejemplo:
ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime cairoTime = ZonedDateTime.now(zone);
LocalDate localDate = cairoTime.toLocalDate();
LocalTime localTime = cairoTime.toLocalTime();
LocalDateTime localDateTime = cairoTime.toLocalDateTime();
3. Trabajar con el tiempo
Al igual que la LocalDateTime
clase, la ZonedDateTime
clase tiene muchas formas de obtener elementos individuales de una fecha y hora. Aquí hay una lista de estos métodos:
|
Devuelve el año de una fecha específica |
|
Devuelve el mes de la fecha: una de varias constantes —JANUARY, FEBRUARY, ...; |
|
Devuelve el índice del mes de la fecha. enero == 1 |
|
Devuelve el índice del día del mes. |
|
Devuelve el día de la semana: una de varias constantes —MONDAY, TUESDAY, ...; |
|
Devuelve el índice del día del año. |
|
Devuelve las horas |
|
Devuelve los minutos |
|
Devuelve los segundos |
|
Devuelve los nanosegundos |
Todos los métodos son perfectamente análogos a los métodos de la LocalDateTime
clase. Y, por supuesto, la ZonedDateTime
clase tiene métodos que te permiten trabajar con fechas y horas. Dicho esto, el objeto en el que se llaman los métodos no cambia. En su lugar, devuelven un nuevo ZonedDateTime
objeto:
Métodos | Descripción |
---|---|
|
Agrega años a la fecha |
|
Agrega meses a la fecha |
|
Agrega días a la fecha |
|
Agrega horas |
|
Agrega minutos |
|
Agrega segundos |
|
Agrega nanosegundos |
|
Resta años a partir de la fecha |
|
Resta meses desde la fecha |
|
Resta días de la fecha |
|
Resta horas |
|
Resta minutos |
|
Resta segundos |
|
Resta nanosegundos |
No proporcionaremos ningún ejemplo, ya que creemos que todo aquí es claro por analogía con las clases que acabamos de considerar.