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: nanosegundosMICROS: microsegundosMILLIS: milisegundosSECONDS: segundosMINUTES: minutosHOURS: horasHALF_DAYS: medio día (12 horas)DAYS: díasWEEKS: semanasMONTHS: mesesYEARS: añosDECADES: décadaCENTURIES: sigloMILLENNIA: milenioERAS: eras
2. Cálculo de tiempo
ChronoUnit se puede utilizar conTemporalobjetos (comoLocalDate) para realizar operaciones de suma y resta de tiempo.
Ejemplo
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 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
Ejemplo:
Ejemplo
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
Ejemplo:
Ejemplo
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
Ejemplo:
Ejemplo
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 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 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
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.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.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
Soporte de unidades de tiempo: No todos los objetos Temporal soportan todos los ChronoUnit. Por ejemplo,
LocalDateno soportaHOURSoMINUTES。Manejo de valores negativos: Cuando el primer parámetro es posterior al segundo,
between()el método devolverá un valor negativo.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.
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.