Fortgeschrittene Arbeit mit Datum und Uhrzeit in Java: Von den Grundlagen zur Professionalität
\n\nDie Arbeit mit Datum und Uhrzeit ist eine der Kernaufgaben jeder Enterprise-Anwendung. In Java war lange Zeit das sperrige java.util.Date und java.util.Calendar der Standard, aber mit der Veröffentlichung von Java 8 änderte sich die Situation grundlegend. Die neue java.time API (JSR-310) bot Entwicklern ein leistungsstarkes, threadsicheres und intuitiv verständliches Toolkit. In diesem Artikel werden wir fortgeschrittene Techniken zur Arbeit mit Datum und Uhrzeit behandeln, die für jeden Java-Entwickler nützlich sind.
1. Grundlagen der java.time API: LocalDate, LocalTime, LocalDateTime
\n\nDer erste Schritt zur professionellen Arbeit ist das Verständnis der drei grundlegenden Klassen, die die alten Pendants ersetzt haben:
\n\n- \n
- LocalDate — Datum ohne Uhrzeit (Jahr, Monat, Tag). \n
- LocalTime — Uhrzeit ohne Datum (Stunden, Minuten, Sekunden, Nanosekunden). \n
- LocalDateTime — Kombination von Datum und Uhrzeit ohne Zeitzonenbindung. \n
// Aktuelles Datum und Uhrzeit abrufen\nLocalDate today = LocalDate.now(); // 2025-03-21\nLocalTime now = LocalTime.now(); // 14:30:15.123\nLocalDateTime current = LocalDateTime.now(); // 2025-03-21T14:30:15.123\n\n// Erstellen eines bestimmten Datums\nLocalDate birthDate = LocalDate.of(1990, Month.JUNE, 15);\nLocalTime meetingTime = LocalTime.of(10, 30, 0);\n\n// Manipulationen mit Daten\nLocalDate nextWeek = today.plusWeeks(1);\nLocalDate lastMonth = today.minusMonths(1);\n\nDiese Klassen sind unveränderlich — jede Operation gibt ein neues Objekt zurück. Dies gewährleistet Threadsicherheit und Vorhersagbarkeit des Codes.
\n\n2. Arbeiten mit Zeitzonen: ZonedDateTime und ZoneId
\n\nGlobale Anwendungen können Zeitzonen nicht ignorieren. Dafür bietet java.time die Klasse ZonedDateTime.
// Aktuelle Zeit in UTC\nZonedDateTime utcNow = ZonedDateTime.now(ZoneOffset.UTC);\n\n// Zeit in einer bestimmten Zeitzone\nZoneId moscowZone = ZoneId.of("Europe/Moscow");\nZonedDateTime moscowTime = ZonedDateTime.now(moscowZone);\n\n// Konvertierung zwischen Zeitzonen\nZonedDateTime nyTime = moscowTime.withZoneSameInstant(ZoneId.of("America/New_York"));\n\n// Abrufen des Offsets\nZoneOffset offset = moscowTime.getOffset(); // +03:00\n\nProfessioneller Tipp: Speichern Sie Daten auf dem Server immer in UTC und konvertieren Sie sie nur auf der Präsentationsebene (UI) in die lokale Zeitzone. Dies vermeidet Probleme mit der Sommer-/Winterzeitumstellung.
\n\n3. Parsen und Formatieren von Daten: DateTimeFormatter
\n\nEine der häufigsten Aufgaben ist die Umwandlung eines Strings in ein Datum und umgekehrt. DateTimeFormatter bietet flexible Möglichkeiten.
Basis-Formatierung
\n\nDateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");\nLocalDateTime dateTime = LocalDateTime.parse("21.03.2025 14:30:00", formatter);\nString formatted = dateTime.format(formatter); // "21.03.2025 14:30:00"\n\nFortgeschrittene Muster
\n\n// ISO-8601\nDateTimeFormatter isoFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;\nString isoDate = dateTime.format(isoFormatter); // "2025-03-21T14:30:00"\n\n// Lokalisierte Formatierung\nDateTimeFormatter italianFormatter = DateTimeFormatter.ofPattern("d MMMM yyyy", Locale.ITALY);\nString italianDate = dateTime.format(italianFormatter); // "21 marzo 2025"\n\n// Eigenes Format mit Textfeldern\nDateTimeFormatter customFormatter = new DateTimeFormatterBuilder()\n .appendValue(ChronoField.YEAR)\n .appendLiteral(" Jahr, ")\n .appendText(ChronoField.MONTH_OF_YEAR, TextStyle.FULL)\n .appendLiteral(" ")\n .appendValue(ChronoField.DAY_OF_MONTH)\n .toFormatter();\nString custom = dateTime.format(customFormatter); // "2025 Jahr, März 21"\n\nWichtig zu beachten: DateTimeFormatter ist ebenfalls unveränderlich und threadsicher.