EMZETT.
Login

Kurz: Das Paket java.time (seit Java 8) ersetzt die alten, fehleranfälligen Klassen Date und Calendar. Alle Objekte sind unveränderlich.

Teil des Kurses Java

Kapitel 18 von 22 im Kurs Java. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Das Paket java.time (seit Java 8) ersetzt die alten, fehleranfälligen Klassen Date und Calendar. Alle Objekte sind unveränderlich.

KlasseInhalt
LocalDateDatum ohne Uhrzeit und Zeitzone
LocalTimeUhrzeit
LocalDateTimeDatum + Uhrzeit (ohne Zeitzone)
ZonedDateTimemit Zeitzone
InstantZeitpunkt auf der Weltzeit-Achse (UTC)
DurationZeitspanne in Sekunden/Nanosekunden
PeriodZeitspanne in Jahren/Monaten/Tagen
import java.time.*;
import java.time.format.*;
 
public class Zeit {
    public static void main(String[] args) {
        LocalDate d = LocalDate.of(2025, 3, 8);
        System.out.println(d + " " + d.getDayOfWeek() + " " + d.getMonth() + " " + d.getDayOfYear() + " " + d.isLeapYear());
 
        LocalDate morgen = d.plusDays(1);
        LocalDate in3Monaten = d.plusMonths(3);
        System.out.println(morgen + " " + in3Monaten + " " + d.minusWeeks(2) + " " + d.withDayOfMonth(1));
 
        LocalDateTime dt = LocalDateTime.of(2025, 12, 24, 18, 30);
        System.out.println(dt + " " + dt.toLocalTime() + " " + dt.getHour());
        System.out.println(d.isBefore(LocalDate.of(2025, 12, 24)) + " " + d.equals(LocalDate.parse("2025-03-08")));
    }
}

Ausgabe:

2025-03-08 SATURDAY MARCH 67 false
2025-03-09 2025-06-08 2025-02-22 2025-03-01
2025-12-24T18:30 18:30 18
true true

Zeiträume berechnen

import java.time.*;
import java.time.temporal.ChronoUnit;
 
public class Spannen {
    public static void main(String[] args) {
        LocalDate start = LocalDate.of(2025, 3, 8), ende = LocalDate.of(2025, 12, 24);
        System.out.println(ChronoUnit.DAYS.between(start, ende) + " Tage");
        Period p = Period.between(LocalDate.of(2000, 5, 17), start);
        System.out.println(p.getYears() + " Jahre, " + p.getMonths() + " Monate, " + p.getDays() + " Tage");
 
        Duration dauer = Duration.between(LocalTime.of(9, 30), LocalTime.of(17, 45));
        System.out.println(dauer + " = " + dauer.toHours() + " h " + dauer.toMinutesPart() + " min");
        System.out.println(Duration.ofSeconds(3725).toMinutes());
    }
}

Ausgabe:

291 Tage
24 Jahre, 9 Monate, 19 Tage
PT8H15M = 8 h 15 min
62

Formatieren und einlesen

import java.time.*;
import java.time.format.*;
import java.util.Locale;
 
public class Format {
    public static void main(String[] args) {
        LocalDateTime dt = LocalDateTime.of(2025, 3, 8, 14, 5);
        DateTimeFormatter f = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
        System.out.println(dt.format(f));
 
        LocalDate d = LocalDate.parse("24.12.2025", DateTimeFormatter.ofPattern("dd.MM.yyyy"));
        System.out.println(d + " " + d.getDayOfWeek());
 
        DateTimeFormatter lang = DateTimeFormatter.ofPattern("EEEE, d. MMMM yyyy", Locale.GERMAN);
        System.out.println(dt.format(lang));
        System.out.println(dt.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
 
        try { LocalDate.parse("31.02.2025", DateTimeFormatter.ofPattern("dd.MM.yyyy")); }
        catch (DateTimeParseException e) { System.out.println("ungültig"); }
    }
}

Ausgabe:

08.03.2025 14:05
2025-12-24 WEDNESDAY
Samstag, 8. März 2025
2025-03-08T14:05:00
MusterBedeutung
yyyy, MM, ddJahr, Monat, Tag
HH, mm, ssStunde (24h), Minute, Sekunde
EEEE, EEEWochentag lang/kurz
MMMM, MMMMonatsname lang/kurz

Zeitzonen

import java.time.*;
 
public class Zonen {
    public static void main(String[] args) {
        ZonedDateTime berlin = ZonedDateTime.of(2025, 7, 1, 12, 0, 0, 0, ZoneId.of("Europe/Berlin"));
        ZonedDateTime tokio = berlin.withZoneSameInstant(ZoneId.of("Asia/Tokyo"));
        ZonedDateTime utc = berlin.withZoneSameInstant(ZoneOffset.UTC);
        System.out.println(berlin);
        System.out.println(tokio.toLocalDateTime() + " | " + utc.toLocalDateTime());
 
        Instant jetzt = Instant.ofEpochSecond(0);
        System.out.println(jetzt + " " + Instant.parse("2025-01-01T00:00:00Z").getEpochSecond());
    }
}

Ausgabe:

2025-07-01T12:00+02:00[Europe/Berlin]
2025-07-01T19:00 | 2025-07-01T10:00
1970-01-01T00:00:00Z 1735689600

Faustregel: Speichere und übertrage Zeitpunkte als Instant (UTC) und rechne erst zur Anzeige in die Ortszeit um.

Aktuelle Zeit und Tests

LocalDate.now() und LocalDateTime.now() liefern die aktuelle Zeit. Für testbaren Code übergibst du eine Clock:

import java.time.*;
 
public class Uhren {
    static String gruss(Clock uhr) {
        int h = LocalTime.now(uhr).getHour();
        return h < 12 ? "Guten Morgen" : h < 18 ? "Guten Tag" : "Guten Abend";
    }
    public static void main(String[] args) {
        Clock morgens = Clock.fixed(Instant.parse("2025-03-08T08:00:00Z"), ZoneOffset.UTC);
        Clock abends = Clock.fixed(Instant.parse("2025-03-08T20:00:00Z"), ZoneOffset.UTC);
        System.out.println(gruss(morgens) + ", " + gruss(abends));
    }
}

Ausgabe:

Guten Morgen, Guten Abend

Merke

  • java.time: LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Instant
  • Alle Objekte sind unveränderlich; plusDays(...) liefert ein neues
  • ChronoUnit.DAYS.between, Period, Duration für Zeitspannen
  • DateTimeFormatter.ofPattern("dd.MM.yyyy") zum Formatieren und Einlesen
  • Zeitpunkte als Instant/UTC speichern; Clock macht Code testbar

Übungsaufgabe

Berechne, wie viele Tage es bis zu deinem nächsten Geburtstag sind, und gib den Wochentag aus.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Dateien und Ein-/Ausgabe

Weiter: Threads und Nebenläufigkeit

Alle Kapitel: Java im Überblick