Java DateTimeFormatter-Klasse

DateTimeFormatter ist eine wichtige Klasse in der Date-Time-API (java.time-Paket), die in Java 8 eingeführt wurde. Sie wird zum Formatieren und Parsen von Date-Time-Objekten verwendet. Diese Klasse bietet leistungsstarke Funktionen für die Handhabung der Anzeige und Konvertierung von Date-Time-Werten.

Einfach ausgedrückt hat DateTimeFormatter zwei Hauptzwecke:

  • Formatierung: Konvertiert Date-Time-Objekte (wie LocalDate, LocalDateTime) in Zeichenketten in einem bestimmten Format
  • Parsen: Konvertiert Zeichenketten, die einem Format entsprechen, in Date-Time-Objekte

Warum benötigen Sie DateTimeFormatter

Vor Java 8 verwendeten wir SimpleDateFormat, um die Formatierung und das Parsen von Datumsangaben zu handhaben, aber es hat mehrere Nachteile:

  • Nicht threadsicher
  • Veraltetes Design
  • Unfreundliche Fehlerbehandlung

DateTimeFormatter löst diese Probleme:

  • Thread-Sicherheit: Instanzen können in Multithread-Umgebungen sicher gemeinsam genutzt werden
  • Unveränderlich: Einmal erstellt, kann es nicht mehr geändert werden
  • Umfangreichere vordefinierte Formate: Bietet eine große Anzahl integrierter Formate
  • Bessere Fehlerbehandlung: Bietet detailliertere Fehlerinformationen, wenn das Parsen fehlschlägt

Grundlegende Verwendung

Vordefinierte Formatierer

DateTimeFormatter stellt viele vordefinierte Formatierer-Konstanten bereit:

Beispiel

LocalDateTime now = LocalDateTime.now();

// Vordefinierten Formatierer verwenden
System.out.println(now.format(DateTimeFormatter.ISO_LOCAL_DATE));     // 2023-11-15
System.out.println(now.format(DateTimeFormatter.ISO_LOCAL_TIME));     // 14:30:45.123
System.out.println(now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); // 2023-11-15T14:30:45.123

Benutzerdefinierte Muster

Sie können benutzerdefinierte Formatierer mithilfe von Musterzeichenfolgen erstellen:

Beispiel

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = now.format(formatter);  // Formatierung
System.out.println(formattedDateTime);             // 2023-11-15 14:30:45

// Parsen
LocalDateTime parsedDateTime = LocalDateTime.parse("2023-11-15 14:30:45", formatter);

// Übliches chinesisches Datumsformat
DateTimeFormatter chineseFormatter = DateTimeFormatter.ofPattern(yyyy-MM-dd);
String formattedDate = today.format(chineseFormatter);
System.out.println(Datum im chinesischen Format: + formattedDate);

// Chinesischen Datumsstring parsen
String chineseDateStr = 2023-05-20;
LocalDate parsedDate = LocalDate.parse(chineseDateStr, chineseFormatter);
System.out.println(Geparstes Datum: + parsedDate);

// Andere gängige Formate
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("MM/dd/yyyy");
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern(yyyy-MM-dd EEEE, Locale.CHINA);

System.out.println(Format 1: + today.format(formatter1));
System.out.println(Format 2: + today.format(formatter2));
System.out.println(Format 3 (mit Wochentag): + today.format(formatter3));

Lokalisierte Formate

Sie können Formatierer basierend auf verschiedenen Locales erstellen:

Beispiel

DateTimeFormatter frenchFormatter =
    DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG)
                     .withLocale(Locale.FRENCH);
String frenchDate = now.format(frenchFormatter);
System.out.println(frenchDate);  // 15 novembre 2023

Referenz für Musterbuchstaben

Wenn Sie benutzerdefinierte Formate erstellen, müssen Sie bestimmte Musterbuchstaben verwenden:

Buchstabe Bedeutung Beispiel
y Jahr yyyy → 2023
M month MM → 11
d day dd → 15
H Stunde (0-23) HH → 14
h Stunde (1-12) hh → 02
m Minute mm → 30
s second ss → 45
S Millisekunde SSS → 123
E Wochentag E → Mi
a AM/PM a → PM

Best Practices

Formatierer wiederverwenden

Da DateTimeFormatter threadsicher ist, wird empfohlen, häufig verwendete Formatierer als Konstanten zu definieren:

Beispiel

public class DateUtils {
    public static final DateTimeFormatter STANDARD_FORMATTER =
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
   
    // Verwendung
    String formatted = LocalDateTime.now().format(STANDARD_FORMATTER);
}

Umfassendes Beispiel:

Beispiel

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class ExampleTest {

    public static void main(String[] args) {
        // 1. LocalDate-Beispiel
        LocalDate currentDate = LocalDate.now();
        System.out.println(Aktuelles Datum: + currentDate);
       
        LocalDate specificDate = LocalDate.of(2023, 5, 20);
        System.out.println(Bestimmtes Datum: + specificDate);

        // 2. LocalTime-Beispiel
        LocalTime currentTime = LocalTime.now();
        System.out.println(Aktuelle Uhrzeit: + currentTime);
       
        LocalTime specificTime = LocalTime.of(14, 30, 15);
        System.out.println(Bestimmte Uhrzeit: + specificTime);

        // 3. LocalDateTime-Beispiel
        LocalDateTime currentDateTime = LocalDateTime.now();
        System.out.println(Aktuelles Datum und Uhrzeit: + currentDateTime);
       
        LocalDateTime specificDateTime = LocalDateTime.of(2023, 5, 20, 14, 30, 15);
        System.out.println(Bestimmtes Datum und Uhrzeit: + specificDateTime);

        // 4. DateTimeFormatter-Beispiel
        // Grundlegende Formatierung
        DateTimeFormatter basicFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        System.out.println(Grundlegende Formatierung: + currentDate.format(basicFormatter));

        // Chinesische Formatierung
        DateTimeFormatter chineseFormatter = DateTimeFormatter.ofPattern(yyyy-MM-dd, Locale.CHINA);
        System.out.println(Chinesisches Datum: + currentDate.format(chineseFormatter));

        // Chinesische Formatierung mit Wochentag
        DateTimeFormatter weekFormatter = DateTimeFormatter.ofPattern(yyyy-MM-dd EEEE, Locale.CHINA);
        System.out.println(Chinesisches Datum mit Wochentag: + currentDate.format(weekFormatter));

        // Zeitformatierung
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern(HH:mm:ss);
        System.out.println(Chinesische Zeit: + currentTime.format(timeFormatter));

        // Datum-Zeit-Formatierung
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println(Standarddatum und -uhrzeit: + currentDateTime.format(dateTimeFormatter));

        // Datum parsen
        String dateStr = "2023-05-20";
        LocalDate parsedDate = LocalDate.parse(dateStr, basicFormatter);
        System.out.println(Geparstes Datum: + parsedDate);

        // Chinesisches Datum parsen
        String chineseDateStr = 2023-05-20;
        LocalDate parsedChineseDate = LocalDate.parse(chineseDateStr, chineseFormatter);
        System.out.println(Geparstes chinesisches Datum: + parsedChineseDate);
    }
}

Die Ausgabe ist:

当前日期: 2025-05-01
特定日期: 2023-05-20
当前时间: 10:46:38.591747
特定时间: 14:30:15
当前日期时间: 2025-05-01T10:46:38.592002
特定日期时间: 2023-05-20T14:30:15
基本格式化: 2025-05-01
中文日期: 2025年05月01日
带星期的中文日期: 2025年05月01日 星期四
中文时间: 10时46分38秒
标准日期时间: 2025-05-01 10:46:38
解析后的日期: 2023-05-20
解析后的中文日期: 2023-05-20

Umgang mit Parse-Ausnahmen

Sie sollten mögliche Ausnahmen beim Parsen von Strings behandeln:

Beispiel

try {
    LocalDateTime dateTime = LocalDateTime.parse("2023-11-15", formatter);
} catch (DateTimeParseException e) {
    System.err.println(Datum/Uhrzeit kann nicht geparst werden: + e.getMessage());
}

Zeitzonen berücksichtigen

Wenn Sie Zeitzonen verarbeiten müssen, können SieZonedDateTimeund spezifische Zeitzonenmuster verwenden:

Beispiel

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println(zonedDateTime.format(formatter));  // 2023-11-15 14:30:45 CST

Zusammenfassung

DateTimeFormatter ist ein leistungsstarkes Werkzeug zum Formatieren und Parsen in der Java-8-Datums-/Uhrzeit-API. Im Vergleich zum alten SimpleDateFormat ist es sicherer, flexibler und einfacher zu verwenden. Wer DateTimeFormatter beherrscht, kann verschiedene Anforderungen an Datums-/Uhrzeitformate effizienter bewältigen.

Merken Sie sich die wichtigsten Punkte:

  • Verwenden Sie vordefinierte Formatierer für gängige Formate
  • Verwenden Sie ofPattern(), um benutzerdefinierte Formate zu erstellen
  • Berücksichtigen Sie Lokalisierung und Zeitzonenanforderungen
  • Threadsichere Formatter-Instanzen wiederverwenden
  • Parse-Ausnahmen korrekt behandeln
Weitere Erweiterungen