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

Ends in 05h 23m 49s

Java 8 ChronoUnit

ChronoUnit es un conjunto estándar de unidades tiempo. Este conjunto brinda acceso basado en unidades para manipular una fecha, hora o fecha-hora. El conjunto estándar de unidades se puede ampliar implementando TemporalUnit.

ChronoUnits definidas en Java 8

Actualmente, hay definidas las siguientes unidades

Unidad (ChronoUnit)Uso
FOREVERRepresenta el concepto de «Siempre»
ERASCada calendario tiene su propio sistema de determinación. La duración estimada de la era se define artificialmente como 1,000,000,000 años.
MILLENIACorrespondiente al concepto de Milenio
CENTURIESPara trabajar con siglos
DECADESPara trabajar con décadas (Periodos de 10 años)
YEARSCorrespondiente al concepto de Año. La duración estimada de un año es 365.2425 Days.
MONTHSPara trabajar con meses. La duración estimada de un mes es una doceava parte de 365.2425 dias.
WEEKSPara trabajar con semanas
DAYSPara trabajar con dias
HALF_DAYSEquivalente al concepto de medio dia
HOURSPara trabajar con horas
MINUTESPara trabajar con minutos
SECONDSPara trabajar con segundos
MILLISPara trabajar con Milesimas de segundo
MICROSPara trabajar con millonesimas de segundos
NANOSLa unidad mas pequeña. Para trabajar con nanosegundos
Lista de unidades ChronoUnits definidas en java 8

addTo()

public <R extends Temporal> R addTo(R temporal, long amount)

Devuelve una copia del objeto temporal indicado tras añadirle el periodo facilitado

Podemos utilizarlo, por ejemplo, para determinar la fecha en que empezo la semana actual haciendo

public static void main(String[] args) {
		
	LocalDateTime hoy = LocalDateTime.now();
	int nSemana = hoy.getDayOfWeek().getValue();
        LocalDateTime primerDiaSemana = ChronoUnit.DAYS.addTo(hoy, 1 - nSemana);
        System.out.println(primerDiaSemana);

	}

Veréis aparecer en consola la fecha completa, en este caso con hora, pero el día, será el primer día de la semana, ya que a la fecha, lo que hemos hecho es restar el numero de días transcurridos de la semana….

between()

public long between(Temporal temporal1Inclusive, Temporal temporal2Exclusive)

Calcula la cantidad de tiempo en las unidades indicadas por la clase MILLENIA, CENTURIES, DECADES, … que estemos utilizando

Si queremos ver el tiempo que hace que nació Carl Sagan, podriamos hacer:

public static void main(String[] args) {
		LocalDate ref = LocalDate.of(1934,11,9);
		LocalDate ahora = LocalDate.now();
		long enAny =  ChronoUnit.YEARS.between(ref, ahora);
		
		System.out.println( "Carl Sagan nació hace " + enAny + " años.");
		
	}

Y recibiriamos en consola

Carl Sagan nació hace 88 años.

getDuration()

public Duration getDuration()

Indica la duración de la unidad utilizada en el calendario ISO

Si queremos ver algunas duraciones, podriamos hacer:

public static void main(String[] args) {
		
		s("Forever     :" + ChronoUnit.FOREVER.getDuration());
		s("Eras en años:" +    ChronoUnit.ERAS.getDuration().toDays()/365.2425);
		s("---------------------------------------------------------");
		s("Decadas   :" + ChronoUnit.DECADES.getDuration());
		s("En dias   :" + ChronoUnit.DECADES.getDuration().toDays());
		s("En Horas  :" + ChronoUnit.DECADES.getDuration().toHours());
		s("En minutos:" + ChronoUnit.DECADES.getDuration().toMinutes());
		
		
	}
	static void s(String salida) {
		System.out.println(salida);
	}

Y veremos en la consola

isDateBased(), isTimeBased()

public boolean isDateBased()
public boolean isTimeBased()

Comprueba si esta unidad es una unidad de fecha o de hora

Cuando tengamos que utilizar alguno de estos valores, podemos necesitar saber si estan basado en fecha o en hora, ya que hay funciones especificas para cada uno de ellos, en el siguiente ejemplo, vemos como podemos hacerlo

public static void main(String[] args) {
		
		ChronoUnit decada = ChronoUnit.DECADES;
		ChronoUnit any = ChronoUnit.YEARS;
		ChronoUnit horas = ChronoUnit.HOURS;
		ver(decada);
		ver(any);
		ver(horas);
		

	}
	static void ver(ChronoUnit verlo) {
		System.out.println(verlo.toString() 
				+ " isDateBased:" + verlo.isDateBased());
		System.out.println(verlo.toString() 
				+ " isTimeBased:" + verlo.isTimeBased());
	}

Nos facilitara una salida de:

isDurationEstimated()

public boolean isDurationEstimated()

Comprueba si la duración facilitada es una estimación

Cuando pedimos la duración del objeto, nos encontramos algunos casos que esa duración no es posible fijarla, y puede que sea interesante que podamos determinarlo

public static void main(String[] args) {
		
		ChronoUnit decada = ChronoUnit.DECADES;
		ChronoUnit any = ChronoUnit.YEARS;
		ChronoUnit mes = ChronoUnit.MONTHS;
		ChronoUnit dia = ChronoUnit.DAYS;
		ChronoUnit horas = ChronoUnit.HOURS;
		ver(decada);
		ver(any);
		ver(mes);
		ver(dia);
		ver(horas);
		

	}
	static void ver(ChronoUnit verlo) {
		System.out.println(verlo.toString() 
			+ " isDurationEstimated:" + verlo.isDurationEstimated());
		
	}

Por consola nos ofrecera unas lineas como estas

isSupportedBy()

public boolean isSupportedBy(Temporal temporal)

Indica si esta unidad es compatible con el objeto temporal que facilitamos

Si debemos utilizar el retorno en alguna otra funcion temporal (java.time), podriamos asegurarnos antes de que va a ser soportado. Eso lo podemos hacer utilizando este metodo. En el ejemplo que sigue, podemos ver los casos que son compatibles para trabajar con LocalDate

public static void main(String[] args) {
		
		ChronoUnit decada = ChronoUnit.DECADES;
		ChronoUnit any = ChronoUnit.YEARS;
		ChronoUnit mes = ChronoUnit.MONTHS;
		ChronoUnit dia = ChronoUnit.DAYS;
		ChronoUnit horas = ChronoUnit.HOURS;
		ver(decada);
		ver(any);
		ver(mes);
		ver(dia);
		ver(horas);
		

	}
	static void ver(ChronoUnit verlo) {
		System.out.println(verlo.toString() 
			+ " isSupportedBy:" + verlo.isSupportedBy(LocalDate.now()));
		
	}

Y tendremos la respuesta en la consola como:

toString()

public String toString()

Devuelve el nombre correspondiente a esta constante de enumeración

En ejemplos anteriores, habeis visto usar este método para completar la edicion en consola. A continuacion hay otro ejemplo aun mas sencillo

public static void main(String[] args) {
		
		ChronoUnit decada = ChronoUnit.DECADES;
		System.out.println(decada.toString());		

	}

En consola nos aparecerá la unidad con la que estamos trabajando; en nuestro caso:

valueOf()

public static ChronoUnit valueOf(String name)

Devuelve la constante de enumeración de este tipo con el nombre especificado.

Se trata de un método en donde podemos esquivar las constantes de enumeración que tenemos, aceptando la entrada desde una string. En el ejemplo, se puede ver la obtencion de un ChronoUnit.MONTHS de dos formas distintas

public static void main(String[] args) {

		ChronoUnit mes = ChronoUnit.MONTHS;
		ChronoUnit mesm = ChronoUnit.valueOf("MONTHS");

		ver(mes);
		ver(mesm);
	}

	static void ver(ChronoUnit verlo) {
		System.out.println(verlo.toString() + " getDuration:" + verlo.getDuration());

	}

La salida que generara esta funcion son dos lineas totalmente iguales, ya que su valor es el mismo

values()

public static ChronoUnit[] values()

Devuelve una matriz que contiene las constantes de este tipo de enumeración, en el orden en que se declaran

Realmente, el objeto de que se parte, no tiene mas importancia, excepto que ha de ser una ChronoUnit, y, el array que se entrega son todos los objetos de esta enumeración, en el ejemplo, hemos añadido el getDuration() para verlo

public static void main(String[] args) {

		// consigo un ChronoUnit
        ChronoUnit chronounit = ChronoUnit.valueOf("FOREVER");
  
        ChronoUnit[] array = chronounit.values();
  
        // presento todas las opciones
        for (int i = 0; i < array.length; i++)
            System.out.println((array[i] + "      ").substring(0,10) + " \t-" +                      array[i].getDuration());
    }

Si os fijáis, hacemos una pequeña edición, ajustando la longitud del nombre, por lo que la salida será

Conclusión

Esta enumeración hace mucho mas que facilitarnos una lista de unidades, ya que proporciona los métodos necesarios para manipular sus valores, y es una de las aportaciones de Java 8 que están dentro de la api de tiempo que proporciona esta version (java.time)

Podéis ver otros objetos de está api y que, seguro, vais a necesitar, siguiendo este articulo

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: 18.226.169.94
Proxy: 18.226.169.94
Remote host: ec2-18-226-169-94.us-east-2.compute.amazonaws.com
Remote port: 45134
** 18.226.169.94, 172.70.126.128