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
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 trueZeiträ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
62Formatieren 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 1735689600Faustregel: 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 AbendMerke
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
Übungsaufgabe
Berechne, wie viele Tage es bis zu deinem nächsten Geburtstag sind, und gib den Wochentag aus.
Quiz zur Selbstkontrolle
Welche Klasse beschreibt ein Datum ohne Uhrzeit?
- LocalDate (richtig)
- Date
- LocalTime
- Instant
Wie viele Tage liegen zwischen zwei LocalDate-Werten?
- ChronoUnit.DAYS.between(a, b) (richtig)
- a - b
- a.minus(b)
- Math.diff(a, b)
Wie speicherst du Zeitpunkte am besten?
- Als Instant (UTC) (richtig)
- Als Text in Ortszeit
- Als LocalTime
- Als int
Weiter im Kurs
Zurück: Dateien und Ein-/Ausgabe
Weiter: Threads und Nebenläufigkeit
Alle Kapitel: Java im Überblick