Classe Java ChronoUnit

ChronoUnit est une classe enum introduite dans Java 8, appartenant aujava.time.temporalpaquet.

ChronoUnit définit un ensemble d'unités de temps standard utilisées pour représenter différentes granularités de date et d'heure. ChronoUnit est principalement utilisé avec l'API Date-Time de Java 8 (commeLocalDate、LocalTime、LocalDateTimeetc.) pour le calcul et la comparaison de temps.


Fonctionnalités principales

1. Représentation des unités de temps

ChronoUnit fournit diverses unités de temps allant des nanosecondes aux siècles, notamment :

  • NANOS: Nanosecondes
  • MICROS: Microsecondes
  • MILLIS: Millisecondes
  • SECONDS: Secondes
  • MINUTES: Minutes
  • HOURS: Heures
  • HALF_DAYS: Demi-journée (12 heures)
  • DAYS: Jours
  • WEEKS: Semaines
  • MONTHS: Mois
  • YEARS: Années
  • DECADES: Décennies
  • CENTURIES: Siècles
  • MILLENNIA: Millénaires
  • ERAS: Ères

2. Calcul temporel

ChronoUnit peut être utilisé avecTemporaldes objets (tels queLocalDate) pour effectuer des opérations d'addition et de soustraction sur le temps.

Exemple

LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS); // Ajouter une semaine
LocalDate lastMonth = today.minus(1, ChronoUnit.MONTHS); // Soustraire un mois

3. Calcul de la différence temporelle

Vous pouvez utiliser labetween()méthode pour calculer la différence entre deux points temporels.

Exemple

LocalDate start = LocalDate.of(2023, 1, 1);
LocalDate end = LocalDate.of(2023, 12, 31);
long days = ChronoUnit.DAYS.between(start, end); // Calculer la différence en jours

Explication détaillée des méthodes courantes

1. Méthode between()

Calcule la différence temporelle entre deux objets Temporal.

Exemple

public long between(Temporal temporal1Inclusive, Temporal temporal2Exclusive)

Exemple :

Exemple

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 heures

2. Méthode addTo()

Ajoute l'unité de temps à un objet Temporal.

Exemple

public Temporal addTo(Temporal temporal, long amount)

Exemple :

Exemple

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

3. Méthode isSupportedBy()

Vérifie si un objet Temporal prend en charge l'unité de temps.

Exemple

public boolean isSupportedBy(Temporal temporal)

Exemple :

Exemple

LocalDate date = LocalDate.now();
boolean supported = ChronoUnit.HOURS.isSupportedBy(date); // false, car LocalDate ne prend pas en charge l'unité heure

Exemples d'applications pratiques

1. Calcul de l'âge

Exemple

LocalDate birthDate = LocalDate.of(1990, 5, 15);
LocalDate now = LocalDate.now();
long age = ChronoUnit.YEARS.between(birthDate, now);
System.out.println("Âge : " + age + " ans");

2. Calcul de la durée du projet

Exemple

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("Durée du projet : " + months + " mois, ou " + days + " jours");

3. Génération de séquences de dates

Exemple

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));
}

Exemple simple

Exemple

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

public class ChronoUnitExample {
    public static void main(String[] args) {
        // 1. Calculer le nombre de jours entre deux dates
        LocalDate today = LocalDate.now();
        LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
        long daysBetween = ChronoUnit.DAYS.between(today, nextWeek);
        System.out.println("Jours entre aujourd'hui et le même jour la semaine prochaine : " + daysBetween);
       
        // 2. Addition et soustraction de temps
        LocalDateTime now = LocalDateTime.now();
        System.out.println("Heure actuelle : " + now);
       
        LocalDateTime in2Hours = now.plus(2, ChronoUnit.HOURS);
        System.out.println("Deux heures plus tard : " + in2Hours);
       
        LocalDateTime yesterday = now.minus(1, ChronoUnit.DAYS);
        System.out.println("À la même heure hier : " + yesterday);
       
        // 3. Calculer le nombre d'heures entre deux instants
        long hoursBetween = ChronoUnit.HOURS.between(yesterday, now);
        System.out.println("Heures écoulées depuis cette heure hier jusqu'à maintenant : " + hoursBetween);
       
        // 4. Utilisation de différentes unités de temps
        System.out.println("Différence en minutes : " + ChronoUnit.MINUTES.between(yesterday, now));
        System.out.println("Différence en secondes : " + ChronoUnit.SECONDS.between(yesterday, now));
       
        // 5. Vérifier si une unité de temps prend en charge un type spécifique
        System.out.println("DAYS prend-il en charge LocalDate : " + ChronoUnit.DAYS.isSupportedBy(today));
        System.out.println("HOURS prend-il en charge LocalDate : " + ChronoUnit.HOURS.isSupportedBy(today));
    }
}

La sortie est :

今天和下周今天之间的天数: 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

Calcul de l'âge

Exemple

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("Age: %d years %d months %d days%n", years, months, days);
    }
}

La sortie est :

年龄: 34 年 11 个月 16 天

Notes

  1. Prise en charge des unités de temps: Tous les objets Temporal ne prennent pas en charge tous les ChronoUnit. Par exemple,LocalDatene prend pas en chargeHOURSouMINUTES。

  2. Gestion des valeurs négatives: Lorsque le premier paramètre est postérieur au second,between()la méthode renverra une valeur négative.

  3. Problèmes de précision: Pour les unités de temps plus grandes (telles que MONTHS ou YEARS), les calculs peuvent ne pas être complètement précis, car le nombre de jours dans ces unités n'est pas fixe.

  4. Considérations de performance: Pour des calculs de temps fréquents, l'utilisation de ChronoUnit est plus efficace et moins sujette aux erreurs que le calcul manuel.


Comparaison avec d'autres classes

1. ChronoUnit vs TimeUnit

  • TimeUnitPrincipalement utilisé pour la mise en sommeil des threads et les opérations concurrentes, avec une granularité des unités de temps plus fine (des nanosecondes aux jours)
  • ChronoUnitConçu spécifiquement pour l'API Date-Time, prenant en charge des unités de temps plus grandes (des semaines aux millénaires)

2. ChronoUnit vs Duration/Period

  • DurationUtilisé pour des quantités de temps précises (de nanoseconds à days)
  • PeriodUtilisé pour des quantités de dates (de days à years)
  • ChronoUnitFournit des méthodes de sélection d'unité et de calcul plus flexibles
Autres extensions