La clase abstracta Clock se facilita en Java 8, dentro de la nueva API «java.time» y, nos facilita una forma de obtener el valor que tiene el instante actual.
Para obtener un objeto clock, ya que no podemos instanciarlo, lo deberemos crear por medio de los siguientes métodos:
Clock.fixed()
public static Clock fixed(Instant fixedInstant, ZoneId zone)
Obtiene un objeto inmutable, seguro para subprocesos y serializable . El principal uso de este método es en las pruebas , donde el reloj necesario se fija en lugar del reloj actual.
Clock.offset()
public static Clock offset(Clock baseClock, Duration offsetDuration)
Obtiene un objeto clock con la hora modificada hacia adelante o hacia atrás, según indique Duration
public static void main(String[] args) {
// hora actual
Clock real = Clock.systemDefaultZone();
System.out.println("Hora actual: "
+ real.instant());
// Creamos otro Clock sin desplazamiento
Clock clock = Clock.offset(real, Duration.ZERO);
System.out.println("Hora "
+ " con Duration = 0 : "
+ clock.instant());
// Nuevo Clock con desplazamiento de 24 horas positivas
clock = Clock.offset(real, Duration.ofHours(24));
System.out.println("Hora "
+ " con Duration = 24hours : "
+ clock.instant());
// Nuevo Clock con desplazamiento de 24 horas negativas
clock = Clock.offset(real, Duration.ofHours(-24));
System.out.println("Hora "
+ " con Duration = -24hours : "
+ clock.instant());
}
Nos presentara en la consola la siguiente informacion
Hora actual: 2022-11-07T16:25:49.209Z
Hora con Duration = 0 : 2022-11-07T16:25:49.230Z
Hora con Duration = 24hours : 2022-11-08T16:25:49.231Z
Hora con Duration = -24hours : 2022-11-06T16:25:49.231Z
Clock.systemXXX()
public static Clock system( ZoneId zone)
public static Clock systemDefaultZone()
public static Clock systemUTC()
Devuelve el objeto Clock según el valor de la zona indicada. Para verlo funcionar, deberemos obtener la hora por medio de LocalTime, ya que «instant()» no tiene en cuenta las zonas horarias.
public static void main(String[] args) {
Clock cMX = Clock.system(ZoneId.of("Mexico/General"));
Clock def = Clock.systemDefaultZone();
Clock utc = Clock.systemUTC();
System.out.println("Mexico: " + LocalTime.now(cMX));
System.out.println("Default:" + LocalTime.now(def));
System.out.println("UTC :" + LocalTime.now(utc));
}
Si ahora obtenemos el LocalTime de esos Clocks, cada uno faciliará el correcto:
Mexico: 11:26:02.846 Default:18:26:02.858 UTC :17:26:02.858
tick, tickMinutes, y tickSeconds
public static Clock tick(Clock baseClock, Duration tickDuration)
public static Clock tickMinutes(ZoneId zoneId)
public static Clock tickSeconds(ZoneId zoneId)
Obtiene un objeto Clock redondeando segundos, minutos o fracciones de tiempo establecidas por un Duration
Usando «tick», deberemos facilitar un clock, y, a continuación, indicamos el intervalo en que deseamos que se redondee la hora. En el ejemplo, hemos indicado un caso para que en segundos solo aparezcan 00 o 30 , que será el redondeo, y otro caso, en donde hemos indicado 20 minutos, con lo que solo aparecerán los 00, 20, y 40 minutos
public static void main(String[] args) {
Clock cdz = Clock.systemDefaultZone();
Clock d30tick = Clock.tick(cdz, Duration.ofSeconds(30));
Clock d20tick = Clock.tick(cdz, Duration.ofMinutes(20));
System.out.println("Clock : " + cdz.instant());
System.out.println("Redondeo 30 sec: " + d30tick.instant());
System.out.println("Redondeo 20 m. : " + d20tick.instant());
}
Lo que veremos en consola, por ejemplo, será
Clock : 2022-11-07T17:57:51.362Z Redondeo 30 sec: 2022-11-07T17:57:30Z Redondeo 20 m. : 2022-11-07T17:40:00Z
Si deseamos utilizar «tickMinutes», el clock obtenido, no muestra segundo en absoluto
public static void main(String[] args) {
ZoneId zoneId = ZoneId.of("America/Mexico_City");
Clock clock = Clock.tickMinutes(zoneId);
System.out.println(clock.instant());
}
La salida en consola SIEMPRE mostrara la parte de segundos a 0
2022-11-07T18:09:00Z
Si deseamos utilizar «tickSeconds», el clock obtenido, no muestra las fracciones de segundo
public static void main(String[] args) {
ZoneId zoneId = ZoneId.of("America/Mexico_City");
Clock clock = Clock.tickSeconds(zoneId);
System.out.println(clock.instant());
}
Y obtenemos en consola
2022-11-07T18:14:27Z
withZone()
public Clock withZone(ZoneId zone)
Devuelve un a copia del reloj traspasado, pero ajustado a la zona indicada
public static void main(String[] args) {
ZoneId zoneMX = ZoneId.of("Mexico/General");
Clock cMX = Clock.system(zoneMX);
System.out.println(LocalTime.now(cMX));
ZoneId zoneBr = ZoneId.of("Europe/Brussels");
Clock cBr = cMX.withZone(zoneBr);
System.out.println(LocalTime.now(cBr));
}
Nos aparecerá en consola
12:25:23.851 19:25:23.865
getZone()
public ZoneId getZone()
Devuelve el identificador de zona utilizado para crear el reloj
public static void main(String[] args) {
Clock cMX = Clock.system(ZoneId.of("Mexico/General"));
Clock def = Clock.systemDefaultZone();
Clock utc = Clock.systemUTC();
System.out.println(cMX.getZone());
System.out.println(def.getZone());
System.out.println(utc.getZone());
}
Nos aparecerá en consola cada uno de las zonas orígenes
Mexico/General Europe/Paris Z
millis()
public long millis()
Devuelve el instante actual en millisegundos
public static void main(String[] args) {
Clock clock = Clock.systemDefaultZone();
System.out.println(clock.millis());
}
Nos mostrara el valor actual en milisegundos, por ejemplo, algo como:
1667846083451
instant()
public Instant instant()
Devuelve el instante que tiene en ese momento el reloj. Atencion, Instant es un tiempo, pero en ninguna base valida.
public static void main(String[] args) {
Clock def = Clock.systemDefaultZone();
System.out.println("Default:" + LocalDateTime.now(def));
System.out.println("instant:" + def.instant());
}
Nos presentara en console
Default:2022-11-07T19:42:38.594 instant:2022-11-07T18:42:38.608Z
Conclusión
La clase Clock, nos permite crear relojes personalizados por Zonas, o fijos, para que luego puedan ser reutilizados en el resto de clases de la api java.time
Este articulo detalle una de las clases de la api java.time descritas anteriormente en el indice que se facilito sobre este tema
Relacionado
Descubre más desde Recursos para formacion
Suscríbete y recibe las últimas entradas en tu correo electrónico.