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 |
---|---|
FOREVER | Representa el concepto de «Siempre» |
ERAS | Cada 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. |
MILLENIA | Correspondiente al concepto de Milenio |
CENTURIES | Para trabajar con siglos |
DECADES | Para trabajar con décadas (Periodos de 10 años) |
YEARS | Correspondiente al concepto de Año. La duración estimada de un año es 365.2425 Days. |
MONTHS | Para trabajar con meses. La duración estimada de un mes es una doceava parte de 365.2425 dias . |
WEEKS | Para trabajar con semanas |
DAYS | Para trabajar con dias |
HALF_DAYS | Equivalente al concepto de medio dia |
HOURS | Para trabajar con horas |
MINUTES | Para trabajar con minutos |
SECONDS | Para trabajar con segundos |
MILLIS | Para trabajar con Milesimas de segundo |
MICROS | Para trabajar con millonesimas de segundos |
NANOS | La unidad mas pequeña. Para trabajar con nanosegundos |
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
Relacionado
Descubre más desde Recursos para formacion
Suscríbete y recibe las últimas entradas en tu correo electrónico.