1. DateTimeFormatter: was ist das und wozu braucht man ihn
In realen Programmen existieren Datumsangaben selten nur im Code. In der Regel muss man sie:
- In einen String umwandeln für die Ausgabe in der Konsole, auf dem Bildschirm oder in einer Datei (zum Beispiel "01.06.2025 14:30").
- Einen String parsen, das heißt eine vom Benutzer eingegebene oder aus einer Datei stammende Zeichenkette wieder in ein Datums-/Zeitobjekt verwandeln.
Dafür gibt es in Java ein leistungsfähiges und bequemes Werkzeug – die Klasse java.time.format.DateTimeFormatter.
Man kann sagen, dass DateTimeFormatter ein Übersetzer zwischen Zeitobjekten (LocalDate, LocalDateTime, ZonedDateTime, Instant und andere) und Strings ist. Er kann:
- Datums-/Zeitobjekte in Strings im gewünschten Format verwandeln (format – Formatierung).
- Strings in Datums-/Zeitobjekte verwandeln (parse – Parsing).
2. Standard-Formatter: schnell und einfach
Java stellt eine Reihe von Standard-Formatern bereit, die die gängigsten ISO-Formate (internationale Standards für Datum und Zeit) abdecken.
Einige davon:
| Formatter | Beispiel-String | Beschreibung |
|---|---|---|
|
2025-06-01 | Nur Datum (Jahr-Monat-Tag) |
|
14:30:00 | Nur Zeit (Stunden:Minuten:Sekunden) |
|
2025-06-01T14:30:00 | Datum und Uhrzeit ohne Zeitzone |
|
2025-06-01T14:30:00+03:00[Europe/Minsk] | Datum, Uhrzeit und Zeitzone |
Beispiel für die Verwendung eines Standard-Formatters
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class FormatterDemo {
public static void main(String[] args) {
LocalDate date = LocalDate.now();
// Datum in String formatieren
String text = date.format(DateTimeFormatter.ISO_LOCAL_DATE);
System.out.println(text); // Zum Beispiel 2025-06-01
// String zurück in ein Datum parsen
LocalDate parsed = LocalDate.parse("2025-06-01", DateTimeFormatter.ISO_LOCAL_DATE);
System.out.println(parsed); // 2025-06-01
}
}
Analogie
Wenn Java ein Café wäre, dann wären die Standard-Formatter „Americano“, „Latte“ und „Espresso“. Schnell, standardisiert – aber manchmal möchte man etwas Besonderes!
3. Benutzerdefinierte Muster: DateTimeFormatter.ofPattern
Manchmal reichen die Standardformate nicht aus. Zum Beispiel soll das Datum als "01.06.2025 14:30" und nicht als "2025-06-01T14:30:00" ausgegeben werden. Dafür können wir mit der Methode DateTimeFormatter.ofPattern(String pattern) ein eigenes Muster erstellen.
Mustersyntax
Im Muster werden besondere Buchstaben verwendet:
- y – Jahr (yyyy – 2025)
- M – Monat (MM – 06)
- d – Tag (dd – 01)
- H – Stunde (24-Stunden-Format, HH – 14)
- m – Minuten (mm – 30)
- s – Sekunden (ss – 00)
Beispiele für Muster
| Muster | Beispielergebnis |
|---|---|
|
01.06.2025 |
|
2025/06/01 |
|
01.06.2025 14:30 |
|
2025-06-01 14:30:00 |
|
1 June 2025 (mit russischer Locale) |
Beispiel: Datum und Uhrzeit formatieren
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class CustomFormatDemo {
public static void main(String[] args) {
LocalDateTime dt = LocalDateTime.of(2025, 6, 1, 14, 30);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
String text = dt.format(formatter);
System.out.println(text); // 01.06.2025 14:30
}
}
Beispiel: String in Datum parsen
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class ParseDemo {
public static void main(String[] args) {
String input = "01.06.2025 14:30";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
LocalDateTime dt = LocalDateTime.parse(input, formatter);
System.out.println(dt); // 2025-06-01T14:30
}
}
Achtung: Das Muster muss exakt zur Zeichenkette passen! Wenn die Zeichenkette Sekunden enthält – fügen Sie :ss in das Muster ein.
4. Formatierung: Datum/Zeit in einen String verwandeln
Allgemeines Vorgehen
- Das benötigte Objekt erstellen (LocalDate, LocalDateTime, ZonedDateTime usw.).
- Einen passenden Formatter erstellen oder auswählen.
- Die Objektmethode format(DateTimeFormatter) aufrufen und einen String erhalten.
Beispiel: Datum in verschiedenen Formaten ausgeben
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class MultiFormatDemo {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 6, 1);
// Standard-ISO
System.out.println(date.format(DateTimeFormatter.ISO_LOCAL_DATE)); // 2025-06-01
// Benutzerdefiniertes Format
DateTimeFormatter rusFormat = DateTimeFormatter.ofPattern("dd.MM.yyyy");
System.out.println(date.format(rusFormat)); // 01.06.2025
// Englischer Stil
DateTimeFormatter usFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy");
System.out.println(date.format(usFormat)); // 06/01/2025
}
}
Zeit formatieren
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class TimeFormatDemo {
public static void main(String[] args) {
LocalTime time = LocalTime.of(14, 30, 5);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
System.out.println(time.format(formatter)); // 14:30:05
}
}
5. Parsing: einen String in Datum/Zeit verwandeln
Allgemeines Vorgehen
- Einen String erhalten (z. B. vom Benutzer).
- Einen Formatter mit demselben Muster erstellen, das der Zeichenkette entspricht.
- Die statische Methode parse() oder die parse()-Methode des Formatters aufrufen.
Beispiel: Datum parsen
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class ParseDateDemo {
public static void main(String[] args) {
String input = "01.06.2025";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
LocalDate date = LocalDate.parse(input, formatter);
System.out.println(date); // 2025-06-01
}
}
Beispiel: Datum und Uhrzeit parsen
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class ParseDateTimeDemo {
public static void main(String[] args) {
String input = "01.06.2025 14:30";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
LocalDateTime dateTime = LocalDateTime.parse(input, formatter);
System.out.println(dateTime); // 2025-06-01T14:30
}
}
6. Parsing-Fehler behandeln
Parsing kann tückisch sein. Wenn die Zeichenkette nicht zum Muster passt, wirft Java die Ausnahme DateTimeParseException. Das ist ein normaler Fall, zum Beispiel wenn der Benutzer ein falsches Datum eingibt.
Beispiel: Fehlerbehandlung beim Parsing
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
public class ParseErrorDemo {
public static void main(String[] args) {
String input = "32.13.2025"; // Ungültiges Datum
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
try {
LocalDate date = LocalDate.parse(input, formatter);
System.out.println(date);
} catch (DateTimeParseException ex) {
System.out.println("Parsing-Fehler: " + ex.getMessage());
}
}
}
Wichtig: Behandeln Sie solche Fehler immer, wenn Sie mit Benutzereingaben arbeiten!
7. Praxis: Datumsangaben für den Benutzer aufbereiten
Angenommen, in unserer Übungsanwendung gibt es die Aufgabe: Der Benutzer gibt sein Geburtsdatum im Format "dd.MM.yyyy" ein, und das Programm soll das Datum im Format "yyyy/MM/dd" sowie den Wochentag ausgeben.
Beispiel
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Scanner;
public class BirthdayFormatDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Geben Sie das Geburtsdatum ein (dd.MM.yyyy): ");
String input = scanner.nextLine();
DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("dd.MM.yyyy");
DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("yyyy/MM/dd");
try {
LocalDate birthday = LocalDate.parse(input, inputFormat);
String formatted = birthday.format(outputFormat);
System.out.println("Ihr Datum im neuen Format: " + formatted);
System.out.println("Wochentag: " + birthday.getDayOfWeek()); // Zum Beispiel SATURDAY
} catch (DateTimeParseException ex) {
System.out.println("Fehler: Ungültiges Datumsformat!");
}
}
}
8. Lokalisierung: wie die Sprache die Formatierung beeinflusst
Mit DateTimeFormatter kann man nicht nur die Reihenfolge der Zahlen ändern, sondern auch den Monat als Wort, den Wochentag usw. ausgeben. Dabei wird die Locale (Sprache und Region) berücksichtigt.
Beispiel: Monatsname auf Russisch
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class LocaleDemo {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 6, 1);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d MMMM yyyy", new Locale("ru"));
System.out.println(date.format(formatter)); // 1 June 2025
}
}
Beispiel: englische Locale
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class LocaleEnDemo {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 6, 1);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d MMMM yyyy", Locale.ENGLISH);
System.out.println(date.format(formatter)); // 1 June 2025
}
}
Tipp: Wenn Monat und Wochentag in der gewünschten Sprache ausgegeben werden sollen – geben Sie die Locale explizit an!
9. Typische Fehler bei der Formatierung und beim Parsing von Datumsangaben
Fehler Nr. 1: Muster und String passen nicht zusammen.
Wenn der String "01.06.2025 14:30" ist, das Muster aber "dd.MM.yyyy", endet das Parsing mit einem Fehler. Das Muster muss exakt mit dem String übereinstimmen.
Fehler Nr. 2: Mustersymbole verwechselt.
MM ist der Monat, mm die Minuten. Wenn Sie "dd.mm.yyyy" schreiben, nimmt Java an, dass Sie Minuten meinen, und liefert einen Fehler. Für den Monat immer ein großes M verwenden.
Fehler Nr. 3: Unbehandelte Ausnahmen beim Parsing.
Wenn Sie DateTimeParseException nicht abfangen, kann das Programm bei falscher Benutzereingabe unerwartet beendet werden. Behandeln Sie solche Fehler immer.
Fehler Nr. 4: Keine Locale angegeben, wenn Wörter verwendet werden.
Wenn Sie ein Muster mit ausgeschriebenem Monat verwenden (MMMM) und keine Locale angeben, kann Java die Standardsprache verwenden (z. B. Englisch). Legen Sie die gewünschte Locale stets explizit fest.
Fehler Nr. 5: Verwendung alter Klassen (SimpleDateFormat, Date) in neuen Projekten.
Denken Sie daran: In modernem Code verwenden Sie java.time und DateTimeFormatter.
GO TO FULL VERSION