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: NanosecondesMICROS: MicrosecondesMILLIS: MillisecondesSECONDS: SecondesMINUTES: MinutesHOURS: HeuresHALF_DAYS: Demi-journée (12 heures)DAYS: JoursWEEKS: SemainesMONTHS: MoisYEARS: AnnéesDECADES: DécenniesCENTURIES: SièclesMILLENNIA: MillénairesERAS: È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 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 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
Exemple :
Exemple
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
Exemple :
Exemple
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
Exemple :
Exemple
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 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 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
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.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.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
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。Gestion des valeurs négatives: Lorsque le premier paramètre est postérieur au second,
between()la méthode renverra une valeur négative.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.
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