1. ZonedDateTimeclase

Hay otra clase muy interesante en la API de fecha y hora: la ZonedDateTimeclase. Su objetivo principal es facilitar el trabajo con fechas en diferentes zonas horarias.

LocalDatees 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.

LocalTimees 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 ZoneIdclase del java.timepaquete 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)
for (String s: ZoneId.getAvailableZoneIds())
   System.out.println(s);
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8

Para obtener un ZoneIdobjeto por su nombre, debe usar el of()método estático;

Código Nota
ZoneId zone = ZoneId.of("Africa/Cairo");
Cairo


2. Crear un ZonedDateTimeobjeto

Al crear un ZonedDateTimeobjeto, debe llamar al now()método estático de la clase y pasarle un ZoneIdobjeto.

Código Salida de consola
ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime time = ZonedDateTime.now(zone);
System.out.println(time);


2019-02-22T11:37:58.074816+02:00[Africa/Cairo]

Si no pasa un ZoneIdobjeto 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
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

2019-02-22T13:39:05.70842+02:00[Europe/Helsinki]

Conversión de una fecha global a una local

Una de las características interesantes de ZonedDateTimees 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 LocalDateTimeclase, la ZonedDateTimeclase tiene muchas formas de obtener elementos individuales de una fecha y hora. Aquí hay una lista de estos métodos:

int getYear()
Devuelve el año de una fecha específica
Month getMonth()
Devuelve el mes de la fecha: una de varias constantes —JANUARY, FEBRUARY, ...;
int getMonthValue()
Devuelve el índice del mes de la fecha. enero == 1
int getDayOfMonth()
Devuelve el índice del día del mes.
DayOfWeek getDayOfWeek()
Devuelve el día de la semana: una de varias constantes —MONDAY, TUESDAY, ...;
int getDayOfYear()
Devuelve el índice del día del año.
int getHour()
Devuelve las horas
int getMinute()
Devuelve los minutos
int getSecond()
Devuelve los segundos
int getNano()
Devuelve los nanosegundos

Todos los métodos son perfectamente análogos a los métodos de la LocalDateTimeclase. Y, por supuesto, la ZonedDateTimeclase 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 ZonedDateTimeobjeto:

Métodos Descripción
plusYears(int)
Agrega años a la fecha
plusMonths(int)
Agrega meses a la fecha
plusDays(int)
Agrega días a la fecha
plusHours(int)
Agrega horas
plusMinutes(int)
Agrega minutos
plusSeconds(int)
Agrega segundos
plusNanos(int)
Agrega nanosegundos
minusYears(int)
Resta años a partir de la fecha
minusMonths(int)
Resta meses desde la fecha
minusDays(int)
Resta días de la fecha
minusHours(int)
Resta horas
minusMinutes(int)
Resta minutos
minusSeconds(int)
Resta segundos
minusNanos(int)
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.