Das Paket java.time (seit Java 8) ersetzt die alten, fehleranfälligen Klassen Date und Calendar. Alle Objekte sind unveränderlich.
| Klasse | Inhalt |
|---|---|
LocalDate | Datum ohne Uhrzeit und Zeitzone |
LocalTime | Uhrzeit |
LocalDateTime | Datum + Uhrzeit (ohne Zeitzone) |
ZonedDateTime | mit Zeitzone |
Instant | Zeitpunkt auf der Weltzeit-Achse (UTC) |
Duration | Zeitspanne in Sekunden/Nanosekunden |
Period | Zeitspanne 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")));
}
}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());
}
}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"); }
}
}08.03.2025 14:05 2025-12-24 WEDNESDAY Samstag, 8. M?rz 2025 2025-03-08T14:05:00
| Muster | Bedeutung |
|---|---|
yyyy, MM, dd | Jahr, Monat, Tag |
HH, mm, ss | Stunde (24h), Minute, Sekunde |
EEEE, EEE | Wochentag lang/kurz |
MMMM, MMM | Monatsname 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());
}
}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));
}
}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,Durationfür ZeitspannenDateTimeFormatter.ofPattern("dd.MM.yyyy")zum Formatieren und Einlesen- Zeitpunkte als
Instant/UTC speichern;Clockmacht Code testbar
Aufgabe
Berechne, wie viele Tage es bis zu deinem nächsten Geburtstag sind, und gib den Wochentag aus.