Guía de la clase de reloj de Java

1. Información general

En este tutorial, veremos la clase Java Clock del paquete java.time . Explicaremos qué es la clase Clock y cómo podemos usarla.

2. La clase del reloj

Clock se agregó en Java 8 y brinda acceso a un instante en el tiempo utilizando el mejor reloj del sistema disponible, y para usarse como un proveedor de tiempo que se puede apuntar de manera efectiva con fines de prueba.

La fecha y la hora actuales dependen de la zona horaria y, para las aplicaciones globalizadas, es necesario un proveedor de hora para garantizar que la fecha y la hora se creen con la zona horaria correcta.

Esta clase nos ayuda a probar que nuestros cambios de código funcionan con diferentes zonas horarias o, cuando usamos un reloj fijo, que la hora no afecta nuestro código.

La clase Clock es abstracta, por lo que no podemos crear una instancia de ella. Se pueden utilizar los siguientes métodos de fábrica:

  • offset (Reloj, Duración) : devuelve un reloj que está compensado por la Duración especificada. El caso de uso principal para esto es simular la ejecución en el futuro o en el pasado.
  • systemUTC (): devuelve un reloj que representa la zona horaria UTC
  • fijo (Instant, ZoneId): siempre devuelve el mismo Instant . El caso de uso principal para esto es en las pruebas, donde el reloj fijo asegura que las pruebas no dependan del reloj actual.

Examinaremos la mayoría de los métodos disponibles en la clase Clock .

2.1. instante()

Este método devuelve un instante que representa el instante actual definido por el reloj:

Clock clock = Clock.systemDefaultZone(); Instant instant = clock.instant(); System.out.println(instant);

Producirá:

2018-04-07T03:59:35.555Z

2.2. systemUTC ()

Este método devuelve un objeto Clock que representa el instante actual en la zona UTC:

Clock clock = Clock.systemUTC(); System.out.println("UTC time :: " + clock.instant());

Producirá:

UTC time :: 2018-04-04T17:40:12.353Z

2.3. sistema()

Este método estático devuelve el objeto Clock para la zona horaria identificada por el ID de zona horaria dado:

Clock clock = Clock.system(ZoneId.of("Asia/Calcutta")); System.out.println(clock.instant());

Producirá:

2018-04-04T18:00:31.376Z

2.4. systemDefaultZone ()

Este método estático devuelve un objeto Clock que representa el instante actual y utiliza la zona horaria predeterminada del sistema en el que se está ejecutando:

Clock clock = Clock.systemDefaultZone(); System.out.println(clock);

Las líneas anteriores producen el siguiente resultado (asumiendo que nuestra zona horaria predeterminada es "Asia / Calcutta"):

SystemClock[Asia/Calcutta]

Podemos lograr el mismo comportamiento pasando ZoneId.systemDefault () :

Clock clock = Clock.system(ZoneId.systemDefault());

2.5. millis ()

Este método devuelve el instante actual del reloj en milisegundos. Se proporciona para permitir el uso del reloj en casos de uso de alto rendimiento en los que la creación de un objeto sería inaceptable . Este método se puede usar en lugares donde de otra manera hubiéramos usado System.currentTimeInMillis () :

Clock clock = Clock.systemDefaultZone(); System.out.println(clock.millis());

Producirá:

1523104441258

2.6. compensar()

Este método estático devuelve un instante del reloj base especificado con la duración especificada añadida.

Si la duración es negativa, el instante de reloj resultante será anterior al reloj base dado.

Usando offset , podemos obtener instantes en el pasado y el futuro del reloj base dado. Si pasamos una duración cero, obtendremos el mismo reloj que el reloj base dado:

Clock baseClock = Clock.systemDefaultZone(); // result clock will be later than baseClock Clock clock = Clock.offset(baseClock, Duration.ofHours(72)); System.out.println(clock5.instant()); // result clock will be same as baseClock                            clock = Clock.offset(baseClock, Duration.ZERO); System.out.println(clock.instant()); // result clock will be earlier than baseClock             clock = Clock.offset(baseClock, Duration.ofHours(-72)); System.out.println(clock.instant());

Producirá:

2018-04-10T13:24:07.347Z 2018-04-07T13:24:07.348Z 2018-04-04T13:24:07.348Z

2.7. garrapata()

Este método estático devuelve instantes del reloj especificado redondeados a la ocurrencia más cercana de la duración especificada . La duración del reloj especificada debe ser positiva:

Clock clockDefaultZone = Clock.systemDefaultZone(); Clock clocktick = Clock.tick(clockDefaultZone, Duration.ofSeconds(30)); System.out.println("Clock Default Zone: " + clockDefaultZone.instant()); System.out.println("Clock tick: " + clocktick.instant());

Producirá:

Clock Default Zone: 2018-04-07T16:42:05.473Z Clock tick: 2018-04-07T16:42:00Z

2.8. tickSeconds ()

Este método estático devuelve el tictac instantáneo actual en segundos completos para la zona horaria determinada. Este reloj siempre tendrá el campo nano-de-segundo puesto a cero:

ZoneId zoneId = ZoneId.of("Asia/Calcutta"); Clock clock = Clock.tickSeconds(zoneId); System.out.println(clock.instant());

Producirá:

2018-04-07T17:40:23Z

Lo mismo se puede lograr usando tick () :

Clock clock = Clock.tick(Clock.system(ZoneId.of("Asia/Calcutta")), Duration.ofSeconds(1));

2.9. tickMinutes ()

This static method returns the clock instant ticking in whole minutes for the specified timezone. This clock will always have the nano-of-second and second-of-minute fields set to zero:

ZoneId zoneId = ZoneId.of("Asia/Calcutta"); Clock clock = Clock.tickMinutes(zoneId); System.out.println(clock.instant());

will produce:

2018-04-07T17:26:00Z

The same can be achieved by using tick():

Clock clock = Clock.tick(Clock.system(ZoneId.of("Asia/Calcutta")), Duration.ofMinutes(1));

2.10. withZone()

This method returns a copy of this clock with a different time zone.

If we have a clock instance for a specific time zone, we can make a copy of that clock for different time zone:

ZoneId zoneSingapore = ZoneId.of("Asia/Singapore");   Clock clockSingapore = Clock.system(zoneSingapore);  System.out.println(clockSingapore.instant()); ZoneId zoneCalcutta = ZoneId.of("Asia/Calcutta"); Clock clockCalcutta = clockSingapore.withZone(zoneCalcutta); System.out.println(clockCalcutta.instant());

will produce:

2018-04-07T17:55:43.035Z 2018-04-07T17:55:43.035Z

2.11. getZone()

This method returns the time zone of the given Clock.

Clock clock = Clock.systemDefaultZone(); ZoneId zone = clock.getZone(); System.out.println(zone.getId());

will produce:

Asia/Calcutta

2.12. fixed()

Este método devuelve un reloj que siempre devuelve el mismo instante . El caso de uso principal de este método está en las pruebas, donde el reloj fijo asegura que las pruebas no dependan del reloj actual.

Clock fixedClock = Clock.fixed(Instant.parse("2018-04-29T10:15:30.00Z"), ZoneId.of("Asia/Calcutta")); System.out.println(fixedClock);

Producirá:

FixedClock[2018-04-29T10:15:30Z,Asia/Calcutta]

3. Conclusión

En este artículo, nos sumergimos en la clase Java Clock y las diferentes formas en que podemos usarla con los métodos disponibles.

Como siempre, los ejemplos de código están disponibles en GitHub.