Java ChronoUnit-Klasse

ChronoUnit ist eine in Java 8 eingeführte Enum-Klasse und gehört zumjava.time.temporaldas Paket verwenden.

ChronoUnit definiert eine Reihe von Standard-Zeiteinheiten, die verwendet werden, um unterschiedliche Granularitäten von Datum und Uhrzeit darzustellen. ChronoUnit wird hauptsächlich mit der Java 8 Date-Time API verwendet (wie z. B.LocalDate、LocalTime、LocalDateTimeetc.) für Zeitberechnung und Vergleich.


Kernfunktionen

1. Darstellung von Zeiteinheiten

ChronoUnit bietet verschiedene Zeiteinheiten von Nanosekunden bis zu Jahrhunderten, darunter:

  • NANOS: Nanosekunden
  • MICROS: Mikrosekunden
  • MILLIS: Millisekunden
  • SECONDS: Sekunden
  • MINUTES: Minuten
  • HOURS: Stunden
  • HALF_DAYS: Halbtag (12 Stunden)
  • DAYS: Tage
  • WEEKS: Wochen
  • MONTHS: Monate
  • YEARS: Jahre
  • DECADES: Jahrzehnte
  • CENTURIES: Jahrhunderte
  • MILLENNIA: Jahrtausende
  • ERAS: Ären

2. Zeitberechnung

ChronoUnit kann mitTemporalObjekten (wie z. B.LocalDate) verwendet werden, um Additions- und Subtraktionsoperationen mit Zeit durchzuführen.

Beispiel

LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS); // Eine Woche hinzufügen
LocalDate lastMonth = today.minus(1, ChronoUnit.MONTHS); // Einen Monat subtrahieren

3. Zeitdifferenzberechnung

Sie können diebetween()Methode zur Berechnung der Differenz zwischen zwei Zeitpunkten.

Beispiel

LocalDate start = LocalDate.of(2023, 1, 1);
LocalDate end = LocalDate.of(2023, 12, 31);
long days = ChronoUnit.DAYS.between(start, end); // Tagesdifferenz berechnen

Detaillierte Erklärung der gängigen Methoden

1. between()-Methode

Berechnet die Zeitdifferenz zwischen zwei Temporal-Objekten.

Beispiel

public long between(Temporal temporal1Inclusive, Temporal temporal2Exclusive)

Beispiel:

Beispiel

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 Stunden

2. addTo()-Methode

Fügt die Zeiteinheit zu einem Temporal-Objekt hinzu.

Beispiel

public Temporal addTo(Temporal temporal, long amount)

Beispiel:

Beispiel

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

3. isSupportedBy()-Methode

Prüft, ob ein Temporal-Objekt die Zeiteinheit unterstützt.

Beispiel

public boolean isSupportedBy(Temporal temporal)

Beispiel:

Beispiel

LocalDate date = LocalDate.now();
boolean supported = ChronoUnit.HOURS.isSupportedBy(date); // false, weil LocalDate die Stundeneinheit nicht unterstützt

Praktische Anwendungsbeispiele

1. Alter berechnen

Beispiel

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

2. Berechnung der Projektdauer

Beispiel

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("Projektdauer: " + months + " Monate, oder " + days + " Tage");

3. Datumssequenzen generieren

Beispiel

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

Einfaches Beispiel

Beispiel

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

public class ChronoUnitExample {
    public static void main(String[] args) {
        // 1. Anzahl der Tage zwischen zwei Datumsangaben berechnen
        LocalDate today = LocalDate.now();
        LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
        long daysBetween = ChronoUnit.DAYS.between(today, nextWeek);
        System.out.println("Tage zwischen heute und demselben Tag nächste Woche: " + daysBetween);
       
        // 2. Addition und Subtraktion von Zeit
        LocalDateTime now = LocalDateTime.now();
        System.out.println("Aktuelle Zeit: " + now);
       
        LocalDateTime in2Hours = now.plus(2, ChronoUnit.HOURS);
        System.out.println("Zwei Stunden später: " + in2Hours);
       
        LocalDateTime yesterday = now.minus(1, ChronoUnit.DAYS);
        System.out.println("Gestern um diese Zeit: " + yesterday);
       
        // 3. Berechne die Anzahl der Stunden zwischen zwei Zeitpunkten
        long hoursBetween = ChronoUnit.HOURS.between(yesterday, now);
        System.out.println("Stunden von gestern um diese Zeit bis jetzt: " + hoursBetween);
       
        // 4. Verschiedene Zeiteinheiten verwenden
        System.out.println("Differenz in Minuten: " + ChronoUnit.MINUTES.between(yesterday, now));
        System.out.println("Differenz in Sekunden: " + ChronoUnit.SECONDS.between(yesterday, now));
       
        // 5. Überprüfen, ob eine Zeiteinheit einen bestimmten Typ unterstützt
        System.out.println("Unterstützt DAYS LocalDate: " + ChronoUnit.DAYS.isSupportedBy(today));
        System.out.println("Unterstützt HOURS LocalDate: " + ChronoUnit.HOURS.isSupportedBy(today));
    }
}

Die Ausgabe ist:

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

Alter berechnen

Beispiel

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

Die Ausgabe ist:

年龄: 34 年 11 个月 16 天

Hinweise

  1. Unterstützung für Zeiteinheiten: Nicht alle Temporal-Objekte unterstützen alle ChronoUnit. Zum Beispiel,LocalDateunterstützt nichtHOURSoderMINUTES。

  2. Handhabung negativer Werte: Wenn der erste Parameter später als der zweite ist,between()gibt die Methode einen negativen Wert zurück.

  3. Genauigkeitsprobleme: Bei größeren Zeiteinheiten (wie MONTHS oder YEARS) können Berechnungen möglicherweise nicht vollständig genau sein, da die Anzahl der Tage in diesen Einheiten nicht festgelegt ist.

  4. Leistungsüberlegungen: Bei häufigen Zeitberechnungen ist die Verwendung von ChronoUnit effizienter und weniger fehleranfällig als die manuelle Berechnung.


Vergleich mit anderen Klassen

1. ChronoUnit vs TimeUnit

  • TimeUnitHauptsächlich für Thread-Schlaf und nebenläufige Operationen verwendet, mit feinerer Granularität der Zeiteinheiten (Nanosekunden bis Tage)
  • ChronoUnitSpeziell für die Date-Time-API entwickelt, mit Unterstützung größerer Zeiteinheiten (Wochen bis Jahrtausende)

2. ChronoUnit vs. Duration/Period

  • DurationWird für präzise Zeitmengen verwendet (Nanosekunden bis Tage)
  • PeriodWird für Datumsangaben verwendet (Tage bis Jahre)
  • ChronoUnitBietet flexiblere Methoden zur Einheitenauswahl und Berechnung
Andere Erweiterungen