Clase ChronoUnit de Java

ChronoUnit es una clase de enumeración introducida en Java 8, que pertenece aljava.time.temporalpaquete.

ChronoUnit define un conjunto de unidades de tiempo estándar para representar diferentes granularidades de fecha y hora. ChronoUnit se utiliza principalmente con la API de fecha y hora de Java 8 (comoLocalDate、LocalTime、LocalDateTimeetc.) para realizar cálculos y comparaciones de tiempo.


Funciones principales

1. Representación de unidades de tiempo

ChronoUnit proporciona varias unidades de tiempo, desde nanosegundos hasta siglos, incluyendo:

  • NANOS: nanosegundos
  • MICROS: microsegundos
  • MILLIS: milisegundos
  • SECONDS: segundos
  • MINUTES: minutos
  • HOURS: horas
  • HALF_DAYS: medio día (12 horas)
  • DAYS: días
  • WEEKS: semanas
  • MONTHS: meses
  • YEARS: años
  • DECADES: década
  • CENTURIES: siglo
  • MILLENNIA: milenio
  • ERAS: eras

2. Cálculo de tiempo

ChronoUnit se puede utilizar conTemporalobjetos (comoLocalDate) para realizar operaciones de suma y resta de tiempo.

Ejemplo

LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS); // Añadir una semana
LocalDate lastMonth = today.minus(1, ChronoUnit.MONTHS); // Restar un mes

3. Cálculo de diferencia de tiempo

Se puede utilizarbetween()el método para calcular la diferencia entre dos puntos de tiempo.

Ejemplo

LocalDate start = LocalDate.of(2023, 1, 1);
LocalDate end = LocalDate.of(2023, 12, 31);
long days = ChronoUnit.DAYS.between(start, end); // Calcular la diferencia en días

Explicación detallada de métodos comunes

1. Método between()

Calcula la diferencia de tiempo entre dos objetos Temporal.

Ejemplo

public long between(Temporal temporal1Inclusive, Temporal temporal2Exclusive)

Ejemplo:

Ejemplo

LocalDateTime start = LocalDateTime.of(2023, 1, 1, 0, 0);
LocalDateTime end = LocalDateTime.of(2023, 1, 2, 12, 0);
long hours = ChronoUnit.HOURS.between(start, end); // 36 horas

2. Método addTo()

Añade la unidad de tiempo a un objeto Temporal.

Ejemplo

public Temporal addTo(Temporal temporal, long amount)

Ejemplo:

Ejemplo

LocalTime time = LocalTime.of(14, 30);
LocalTime newTime = (LocalTime) ChronoUnit.HOURS.addTo(time, 3); // 17:30

3. Método isSupportedBy()

Comprueba si el objeto Temporal soporta esta unidad de tiempo.

Ejemplo

public boolean isSupportedBy(Temporal temporal)

Ejemplo:

Ejemplo

LocalDate date = LocalDate.now();
boolean supported = ChronoUnit.HOURS.isSupportedBy(date); // false, porque LocalDate no soporta la unidad de horas

Ejemplos de aplicación práctica

1. Calcular la edad

Ejemplo

LocalDate birthDate = LocalDate.of(1990, 5, 15);
LocalDate now = LocalDate.now();
long age = ChronoUnit.YEARS.between(birthDate, now);
System.out.println("Edad: " + age + " años");

2. Calcular la duración de un proyecto

Ejemplo

LocalDateTime projectStart = LocalDateTime.of(2023, 1, 1, 9, 0);
LocalDateTime projectEnd = LocalDateTime.of(2023, 6, 30, 18, 0);
long months = ChronoUnit.MONTHS.between(projectStart, projectEnd);
long days = ChronoUnit.DAYS.between(projectStart, projectEnd);
System.out.println("Duración del proyecto: " + months + " meses, o " + days + " días");

3. Generar secuencias de fechas

Ejemplo

LocalDate start = LocalDate.of(2023, 1, 1);
List<LocalDate> dates = new ArrayList<>();
for (int i = 0; i < 7; i++) {
    dates.add(start.plus(i, ChronoUnit.DAYS));
}

Ejemplo sencillo

Ejemplo

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

public class ChronoUnitExample {
    public static void main(String[] args) {
        // 1. Calcular el número de días entre dos fechas
        LocalDate today = LocalDate.now();
        LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
        long daysBetween = ChronoUnit.DAYS.between(today, nextWeek);
        System.out.println("El número de días entre hoy y el mismo día de la próxima semana: " + daysBetween);
       
        // 2. Suma y resta de tiempo
        LocalDateTime now = LocalDateTime.now();
        System.out.println("Hora actual: " + now);
       
        LocalDateTime in2Hours = now.plus(2, ChronoUnit.HOURS);
        System.out.println("Dos horas después: " + in2Hours);
       
        LocalDateTime yesterday = now.minus(1, ChronoUnit.DAYS);
        System.out.println("Ayer a esta hora: " + yesterday);
       
        // 3. Calcular el número de horas entre dos puntos de tiempo
        long hoursBetween = ChronoUnit.HOURS.between(yesterday, now);
        System.out.println("Número de horas entre ayer a esta hora y ahora: " + hoursBetween);
       
        // 4. Usar diferentes unidades de tiempo
        System.out.println("Diferencia en minutos: " + ChronoUnit.MINUTES.between(yesterday, now));
        System.out.println("Diferencia en segundos: " + ChronoUnit.SECONDS.between(yesterday, now));
       
        // 5. Comprobar si la unidad de tiempo soporta un tipo específico
        System.out.println("DAYS soporta LocalDate: " + ChronoUnit.DAYS.isSupportedBy(today));
        System.out.println("HOURS soporta LocalDate: " + ChronoUnit.HOURS.isSupportedBy(today));
    }
}

El resultado es:

今天和下周今天之间的天数: 7
当前时间: 2025-05-01T11:22:22.247669
两小时后: 2025-05-01T13:22:22.247669
昨天此时: 2025-04-30T11:22:22.247669
昨天此时到现在的小时数: 24
相差的分钟数: 1440
相差的秒数: 86400
DAYS是否支持LocalDate: true
HOURS是否支持LocalDate: false

Calcular la edad

Ejemplo

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class AgeCalculator {
    public static void main(String[] args) {
        LocalDate birthDate = LocalDate.of(1990, 5, 15);
        LocalDate currentDate = LocalDate.now();
       
        long years = ChronoUnit.YEARS.between(birthDate, currentDate);
        long months = ChronoUnit.MONTHS.between(birthDate, currentDate) % 12;
        long days = ChronoUnit.DAYS.between(
            birthDate.plusYears(years).plusMonths(months),
            currentDate
        );
       
        System.out.printf("Edad: %d año(s) %d mes(es) %d día(s)%n", years, months, days);
    }
}

El resultado es:

年龄: 34 年 11 个月 16 天

Notas

  1. Soporte de unidades de tiempo: No todos los objetos Temporal soportan todos los ChronoUnit. Por ejemplo,LocalDateno soportaHOURSoMINUTES。

  2. Manejo de valores negativos: Cuando el primer parámetro es posterior al segundo,between()el método devolverá un valor negativo.

  3. Problemas de precisión: Para unidades de tiempo grandes (como MONTHS o YEARS), el cálculo puede no ser completamente preciso, porque el número de días de estas unidades no es fijo.

  4. Consideraciones de rendimiento: Para cálculos de tiempo frecuentes, usar ChronoUnit es más eficiente y menos propenso a errores que el cálculo manual.


Comparación con otras clases

1. ChronoUnit vs TimeUnit

  • TimeUnitSe utiliza principalmente para la suspensión de hilos y operaciones concurrentes, con unidades de tiempo de granularidad fina (de nanosegundos a días).
  • ChronoUnitDiseñada específicamente para la API de fecha y hora, soporta unidades de tiempo más grandes (de semanas a milenios).

2. ChronoUnit vs Duration/Period

  • DurationSe utiliza para cantidades de tiempo precisas (de nanosegundos a días).
  • PeriodSe utiliza para cantidades de fecha (de días a años).
  • ChronoUnitOfrece una selección de unidades y métodos de cálculo más flexibles.
Otras extensiones