Einführung in die Arbeit mit Datum und Uhrzeit in Java
Die Arbeit mit Datum und Uhrzeit gehört zu den häufigsten Aufgaben in der Entwicklung. Ob Ereignisprotokollierung, Berechnung von Fristen, Datenfilterung oder Kalenderanzeige – ohne sichere Beherrschung der Zeit-APIs kommt man nicht aus. In Java wurden lange Zeit die Klassen java.util.Date und java.util.Calendar verwendet, die jedoch viele Nachteile hatten: Veränderbarkeit (Mutabilität), unintuitive API und Probleme mit Threads.
Ab Java 8 wurde dem Sprachumfang das neue Paket java.time hinzugefügt, das auf dem Standard ISO-8601 basiert. Es bietet immutable (unveränderliche) und thread-sichere Klassen, die wesentlich benutzerfreundlicher sind. In diesem Artikel werden wir sowohl die alten als auch die neuen Ansätze behandeln und praktische Codebeispiele zeigen.
1. Veraltete Klassen: Date und Calendar
Obwohl die Verwendung von Date und Calendar in neuen Projekten nicht empfohlen wird, können Sie ihnen in Legacy-Code begegnen. Betrachten wir die wichtigsten Punkte.
Die Klasse java.util.Date
Die Klasse Date repräsentiert einen bestimmten Zeitpunkt mit einer Genauigkeit von Millisekunden. Sie hat viele veraltete Methoden.
import java.util.Date;
public class DateExample { public static void main(String[] args) { // Aktuelles Datum und Uhrzeit Date now = new Date(); System.out.println("Aktuelle Zeit: " + now);
// Konstruktor mit Millisekunden (seit 1. Januar 1970) Date specificDate = new Date(1000000000000L); System.out.println("Datum: " + specificDate);
// Datumsvergleich boolean after = now.after(specificDate); System.out.println("now nach specificDate? " + after); }}Die Klasse java.util.Calendar
Calendar ist eine flexiblere, aber immer noch umständliche Klasse zur Datumsmanipulation.
import java.util.Calendar;
public class CalendarExample { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); // Festlegen eines bestimmten Datums cal.set(2025, Calendar.MARCH, 15, 10, 30, 0); System.out.println("Festgelegtes Datum: " + cal.getTime());
// Abrufen einzelner Felder int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) + 1; // Monate beginnen bei 0 int day = cal.get(Calendar.DAY_OF_MONTH); System.out.println("Jahr: " + year + ", Monat: " + month + ", Tag: " + day);
// Tage hinzufügen cal.add(Calendar.DAY_OF_MONTH, 10); System.out.println("In 10 Tagen: " + cal.getTime()); }}Nachteile: Veränderbarkeit (Methoden verändern das Objekt selbst), Komplexität bei der Arbeit mit Zeitzonen, Verwirrung durch Monatsindizes.
2. Modernes API: java.time (Java 8+)
Das Paket java.time löst alle Probleme der alten Klassen. Die wichtigsten Klassen:
- LocalDate — Datum ohne Uhrzeit (Jahr, Monat, Tag);
- LocalTime — Uhrzeit ohne Datum (Stunden, Minuten, Sekunden, Nanosekunden);
- LocalDateTime — Datum und Uhrzeit ohne Zeitzone;
- ZonedDateTime — Datum und Uhrzeit mit Zeitzone;
- Instant — Zeitpunkt in UTC;
- Duration und Period — für die Arbeit mit Zeitintervallen.
LocalDate — Arbeiten mit Daten
import java.time.LocalDate;import java.time.Month;
public class LocalDateExample { public static void main(String[] args) { // Aktuelles Datum LocalDate today = LocalDate.now(); System.out.println("Heute: " + today);
// Bestimmtes Datum LocalDate specific = LocalDate.of(2025, Month.DECEMBER, 25); System.out.println("Weihnachten: " + specific);
// Tage hinzufügen LocalDate nextWeek = to