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")));
}
}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
| 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());
}
}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,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.