Enjoy A New Student Discount All 55,000 Courses on sale for Only $12.99

Ends in 05h 23m 49s

Java 8 – Clock

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.

Ejemplo de utilización de Clock.fixed

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

Deja un comentario

/*Si te ha gustado el artículo
no dudes en compartirlo*/

Facebook
Twitter
LinkedIn

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies

Ver mi IP

Ver ip de mi máquina
tipo valor
Ip: 3.145.63.136
Proxy: 3.145.63.136
Remote host: ec2-3-145-63-136.us-east-2.compute.amazonaws.com
Remote port: 42252
** 3.145.63.136, 172.70.100.186