CodeGym /Kurse /JAVA 25 SELF /Berechnungen und Vergleiche von Datums-/Zeitangaben, Dura...

Berechnungen und Vergleiche von Datums-/Zeitangaben, Duration, Period

JAVA 25 SELF
Level 13 , Lektion 5
Verfügbar

1. Addition und Subtraktion von Datum und Zeit

In der Programmierung ist der Umgang mit Datum und Zeit – das ist nicht nur „ein Datum hübsch auf dem Bildschirm ausgeben“. Sehr oft muss man:

  • herausfinden, wie viele Tage bis zu einem wichtigen Ereignis verbleiben;
  • das Alter eines Benutzers berechnen;
  • bestimmen, wie viel Zeit zwischen zwei Ereignissen vergangen ist;
  • prüfen, ob eine Deadline bereits erreicht ist;
  • zu einem Datum eine bestimmte Anzahl von Tagen, Wochen, Monaten oder Stunden addieren.

Zum Beispiel möchten wir in unserer Anwendung den Benutzer daran erinnern, dass bis zur Deadline einer Aufgabe noch 3 Tage bleiben. Oder ihm nachträglich zum Geburtstag gratulieren (wenn das Datum bereits in der Vergangenheit liegt).

Dafür gibt es in java.time spezielle Klassen und Methoden, die solche Berechnungen einfach und sicher machen.

Wesentliche Methoden zum Addieren und Subtrahieren

Alle Klassen für Datum und Zeit (LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Instant) haben Methoden:

  • plusXxx() – addieren (Tage, Monate, Jahre, Stunden, Minuten usw.)
  • minusXxx() – subtrahieren (dasselbe)
import java.time.LocalDate;

LocalDate today = LocalDate.now(); // Heutiges Datum
LocalDate tomorrow = today.plusDays(1); // Morgen
LocalDate nextMonth = today.plusMonths(1); // In einem Monat
LocalDate lastWeek = today.minusWeeks(1); // Vor einer Woche

System.out.println("Heute: " + today);
System.out.println("Morgen: " + tomorrow);
System.out.println("In einem Monat: " + nextMonth);
System.out.println("Vor einer Woche: " + lastWeek);

Alle diese Methoden geben ein neues Objekt zurück und ändern das ursprüngliche nicht. Unveränderlichkeit ist das A und O!

import java.time.LocalTime;

LocalTime now = LocalTime.now();
LocalTime inTwoHours = now.plusHours(2);
LocalTime tenMinutesAgo = now.minusMinutes(10);

System.out.println("Jetzt: " + now);
System.out.println("In 2 Stunden: " + inTwoHours);
System.out.println("Vor 10 Minuten: " + tenMinutesAgo);

Kombinierte Methoden

LocalDate vacation = today.plusMonths(2).plusDays(10);
System.out.println("Urlaub: " + vacation);

2. Differenzen zwischen Daten ermitteln: Period und Duration

Wenn Sie wissen müssen, wie viel Zeit zwischen zwei Daten oder Zeitpunkten vergangen ist, betreten zwei Helden die Bühne – Period und Duration. Lernen wir sie näher kennen.

Worin besteht der Unterschied zwischen Period und Duration?

  • Period – für die Arbeit mit Datumsangaben (Jahr, Monat, Tag). Zum Beispiel „3 Jahre, 2 Monate und 5 Tage“.
  • Duration – für die Arbeit mit Zeit (Stunden, Minuten, Sekunden, Nanosekunden). Zum Beispiel „5 Stunden 30 Minuten“.
Klasse Wofür gedacht Beispiel
Period
Differenz zwischen Datumsangaben Wie viele Jahre/Monate/Tage zwischen den Datumsangaben
Duration
Differenz zwischen Zeitpunkten Wie viele Stunden/Minuten/Sekunden zwischen Ereignissen

Beispiel: Alter eines Benutzers berechnen

import java.time.LocalDate;
import java.time.Period;

LocalDate birthday = LocalDate.of(2000, 1, 15); // Geburtstag
LocalDate today = LocalDate.now();

Period age = Period.between(birthday, today);

System.out.println("Alter: " + age.getYears() + " Jahre, " +
                   age.getMonths() + " Monate, " +
                   age.getDays() + " Tage");

Analogie: Period ist die „menschliche“ Differenz zwischen Daten („Ich bin 24 Jahre 5 Monate 12 Tage alt“).

Beispiel: wie viel Zeit bis zur Deadline übrig ist

import java.time.LocalDate;

LocalDate deadline = LocalDate.of(2025, 7, 1);
LocalDate today = LocalDate.now();

if (today.isBefore(deadline)) {
    Period left = Period.between(today, deadline);
    System.out.println("Bis zur Deadline verbleiben: " +
        left.getMonths() + " Monate und " +
        left.getDays() + " Tage");
} else {
    System.out.println("Die Deadline ist bereits vorbei!");
}

Duration: Zeitdifferenz

import java.time.LocalDateTime;
import java.time.Duration;

LocalDateTime start = LocalDateTime.of(2025, 6, 1, 10, 0, 0);
LocalDateTime end = LocalDateTime.of(2025, 6, 1, 15, 30, 0);

Duration duration = Duration.between(start, end);

System.out.println("Dauer: " + duration.toHours() + " Stunden " +
                   (duration.toMinutes() % 60) + " Minuten");

Duration misst die Differenz in Sekunden, Minuten, Stunden, Tagen (aber Tage sind immer 24 Stunden, ohne kalendarische Besonderheiten zu berücksichtigen).

Vergleich: Wann Period und wann Duration verwenden?

  • Wenn Sie nur Datumsangaben (ohne Zeit) haben – verwenden Sie Period.
  • Wenn Sie Zeitanteile haben (z. B. LocalDateTime, Instant) – verwenden Sie Duration.

3. Vergleich von Datum und Zeit: isBefore, isAfter, equals

Manchmal muss man einfach verstehen: Ist das Datum schon eingetreten oder noch nicht? Liegt das Ereignis in der Vergangenheit oder in der Zukunft? Dafür haben alle Klassen für Datum und Zeit die folgenden Methoden:

  • isBefore(otherDate)
  • isAfter(otherDate)
  • isEqual(otherDate) (oder einfach equals)
import java.time.LocalDate;

LocalDate today = LocalDate.now();
LocalDate deadline = LocalDate.of(2025, 7, 1);

if (today.isBefore(deadline)) {
    System.out.println("Es ist noch Zeit!");
} else if (today.isEqual(deadline)) {
    System.out.println("Heute ist die Deadline!");
} else {
    System.out.println("Die Deadline ist schon vorbei :(");
}
import java.time.LocalTime;

LocalTime now = LocalTime.now();
LocalTime lunch = LocalTime.of(13, 0);

if (now.isAfter(lunch)) {
    System.out.println("Das Mittagessen ist schon vorbei!");
} else {
    System.out.println("Bis zum Mittagessen ist noch Zeit.");
}

Wichtig: Vergleichen kann man nur Objekte desselben Typs (LocalDate mit LocalDate, LocalDateTime mit LocalDateTime usw.).

4. Praxis: Aufgaben zur Differenzberechnung und Fristenprüfung

Beispiel: wie viele Tage bis zur Deadline einer Aufgabe verbleiben

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

LocalDate today = LocalDate.now();
LocalDate deadline = LocalDate.of(2025, 7, 1);

long daysLeft = ChronoUnit.DAYS.between(today, deadline);

if (daysLeft > 0) {
    System.out.println("Bis zur Deadline verbleiben " + daysLeft + " Tage");
} else if (daysLeft == 0) {
    System.out.println("Heute ist die Deadline!");
} else {
    System.out.println("Die Deadline ist vor " + Math.abs(daysLeft) + " Tagen verstrichen");
}

ChronoUnit.DAYS.between() – eine bequeme Methode, um die genaue Anzahl von Tagen zwischen zwei Daten zu erfahren (ohne Monate und Jahre zu berücksichtigen).

Beispiel: wie viele Sekunden zwischen zwei Ereignissen liegen

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

LocalDateTime start = LocalDateTime.of(2025, 6, 1, 10, 0, 0);
LocalDateTime end = LocalDateTime.of(2025, 6, 1, 15, 30, 0);

long seconds = ChronoUnit.SECONDS.between(start, end);

System.out.println("Zwischen den Ereignissen sind " + seconds + " Sekunden vergangen");

Beispiel: Alter einer Aufgabe berechnen

import java.time.LocalDate;
import java.time.Period;

LocalDate created = LocalDate.of(2025, 5, 20);
LocalDate today = LocalDate.now();

Period period = Period.between(created, today);

System.out.println("Die Aufgabe wurde vor " +
    period.getDays() + " Tagen, " +
    period.getMonths() + " Monaten und " +
    period.getYears() + " Jahren erstellt.");

Beispiel: Dauer zwischen zwei Instant

import java.time.Instant;
import java.time.Duration;

Instant start = Instant.now();
// ... etwas tun ...
Instant end = Instant.now();

Duration duration = Duration.between(start, end);

System.out.println("Die Ausführung dauerte " + duration.toMillis() + " Millisekunden");

5. Besonderheiten bei der Verwendung von Period und Duration

Besonderheiten von Period

  • Period berechnet die Differenz nach dem Kalender: zwischen dem 28. Februar und dem 1. März – 1 Tag, auch wenn es unterschiedliche Monate sind.
  • Sie können die Anzahl von Jahren, Monaten und Tagen getrennt abrufen: getYears(), getMonths(), getDays().
  • Wenn Sie die Gesamtzahl der Tage zwischen Daten wissen wollen – verwenden Sie ChronoUnit.DAYS.between().

Besonderheiten von Duration

  • Duration arbeitet mit exakter Zeit (Stunden, Minuten, Sekunden).
  • Kann mit LocalTime, LocalDateTime, Instant arbeiten.
  • Für Daten ohne Zeitanteil (LocalDate) nicht verwendbar – es kommt zu einer Ausnahme.

Beispiel: Unterschied zwischen Period und Duration

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Duration;
import java.time.Period;

LocalDate date1 = LocalDate.of(2025, 2, 28);
LocalDate date2 = LocalDate.of(2025, 3, 1);

Period period = Period.between(date1, date2); // 2 Tage (Schaltjahr)
long days = java.time.temporal.ChronoUnit.DAYS.between(date1, date2); // 2 Tage

System.out.println("Period: " + period.getDays() + " Tage");
System.out.println("ChronoUnit: " + days + " Tage");

LocalDateTime dt1 = LocalDateTime.of(2025, 6, 1, 23, 0);
LocalDateTime dt2 = LocalDateTime.of(2025, 6, 2, 1, 0);

Duration duration = Duration.between(dt1, dt2); // 2 Stunden
System.out.println("Duration: " + duration.toHours() + " Stunden");

6. Duration und Period verwenden, um die Differenz benutzerfreundlich auszugeben

Wenn Sie die Differenz zwischen Daten oder Zeiten für den Benutzer berechnen, ist es nicht immer sinnvoll, „123456 Sekunden“ anzuzeigen. Üblicher ist etwas wie „2 Tage 3 Stunden 15 Minuten“.

Beispiel: Ausgabe der Differenz zwischen Datum und Zeit

import java.time.LocalDateTime;
import java.time.Duration;

LocalDateTime start = LocalDateTime.of(2025, 6, 1, 14, 0);
LocalDateTime end = LocalDateTime.of(2025, 6, 3, 16, 30);

Duration duration = Duration.between(start, end);

long days = duration.toDays();
long hours = duration.minusDays(days).toHours();
long minutes = duration.minusDays(days).minusHours(hours).toMinutes();

System.out.println("Differenz: " + days + " Tage " +
    hours + " Stunden " + minutes + " Minuten");

7. Besonderheiten bei der Arbeit mit ZonedDateTime und Instant

  • Die Differenz zwischen zwei ZonedDateTime in verschiedenen Zonen wird nach absoluter Zeit berechnet, nicht nach der „menschlichen“ Zeit in jeder Zone.
  • Die Umstellung auf Sommer-/Winterzeit kann die Stundendifferenz zwischen Daten beeinflussen.

Beispiel: Differenz zwischen ZonedDateTime

import java.time.ZonedDateTime;
import java.time.ZoneId;
import java.time.Duration;

ZonedDateTime MinskTime = ZonedDateTime.of(2025, 6, 1, 12, 0, 0, 0, ZoneId.of("Europe/Minsk"));
ZonedDateTime nyTime = ZonedDateTime.of(2025, 6, 1, 5, 0, 0, 0, ZoneId.of("America/New_York"));

Duration diff = Duration.between(nyTime, MinskTime);
System.out.println("Differenz: " + diff.toHours() + " Stunden");

8. Häufige Fehler bei Berechnungen mit Datum und Zeit

Fehler Nr. 1: Period und Duration werden verwechselt.
Wenn Sie versuchen, Duration für LocalDate zu verwenden, erhalten Sie eine Ausnahme. Für Daten verwenden Sie Period, für Zeiten – Duration.

Fehler Nr. 2: Zeitzonen werden nicht berücksichtigt.
Wenn Datum und Zeit in unterschiedlichen Zeitzonen verglichen werden, können unerwartete Ergebnisse entstehen. Bringen Sie alles besser in eine Zone oder verwenden Sie Instant.

Fehler Nr. 3: Es wird erwartet, dass die Methoden plus/minus das Objekt ändern.
Alle Objekte von java.time sind unveränderlich! Vergessen Sie nicht, das Ergebnis einer neuen Variablen zuzuweisen (zum Beispiel today = today.plusDays(1)).

Fehler Nr. 4: getDays() bei Period wird verwendet und man denkt, dass dies die Gesamtzahl der Tage ist.
Tatsächlich sind das nur die Resttage nach Abzug von Jahren und Monaten. Für die Gesamtzahl der Tage verwenden Sie ChronoUnit.DAYS.between().

Fehler Nr. 5: Es werden Objekte unterschiedlichen Typs verglichen.
Die Methoden isBefore, isAfter, isEqual funktionieren nur für Objekte desselben Typs (zum Beispiel LocalDate mit LocalDate).

1
Umfrage/Quiz
Datumsangaben und Uhrzeit, Level 13, Lektion 5
Nicht verfügbar
Datumsangaben und Uhrzeit
Datum, Uhrzeit und Zeitzonen
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION