Classe Java DateTimeFormatter

DateTimeFormatter est une classe importante de l'API date-heure (paquet java.time) introduite dans Java 8. Elle est utilisée pour formater et analyser des objets date-heure. Cette classe offre des fonctionnalités puissantes pour gérer l'affichage et la conversion des valeurs date-heure.

En termes simples, DateTimeFormatter a deux objectifs principaux :

  • Formatage: Convertit les objets date-heure (tels que LocalDate, LocalDateTime) en chaînes de caractères dans un format spécifique
  • Analyse: Convertit les chaînes de caractères qui correspondent à un format en objets date-heure

Pourquoi avez-vous besoin de DateTimeFormatter

Avant Java 8, nous utilisions SimpleDateFormat pour gérer le formatage et l'analyse des dates, mais cela présente plusieurs inconvénients :

  • Non sécurisé pour les threads
  • Conception obsolète
  • Gestion des erreurs peu conviviale

DateTimeFormatter résout ces problèmes :

  • Sécurité des threads: Les instances peuvent être partagées en toute sécurité dans des environnements multithread
  • Immuable: Une fois créé, il ne peut pas être modifié
  • Formats prédéfinis plus riches: Fournit un grand nombre de formats intégrés
  • Meilleure gestion des erreurs: Fournit des informations d'erreur plus détaillées en cas d'échec de l'analyse

Utilisation de base

Formateurs prédéfinis

DateTimeFormatter fournit de nombreuses constantes de formateur prédéfinies:

Exemple

LocalDateTime now = LocalDateTime.now();

// Utiliser un formateur prédéfini
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

Modèles personnalisés

Vous pouvez créer des formateurs personnalisés à l'aide de chaînes de modèle :

Exemple

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

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

// Format de date chinois courant
DateTimeFormatter chineseFormatter = DateTimeFormatter.ofPattern(yyyy-MM-dd);
String formattedDate = today.format(chineseFormatter);
System.out.println(Date au format chinois : + formattedDate);

// Analyser la chaîne de date chinoise
String chineseDateStr = 2023-05-20;
LocalDate parsedDate = LocalDate.parse(chineseDateStr, chineseFormatter);
System.out.println(Date analysée : + parsedDate);

// Autres formats courants
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 (avec jour de la semaine) : + today.format(formatter3));

Formats localisés

Vous pouvez créer des formateurs basés sur différentes locales :

Exemple

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

Référence des lettres de modèle

Lors de la création de formats personnalisés, vous devez utiliser des lettres de modèle spécifiques :

Lettre Signification Exemple
y année yyyy → 2023
M month MM → 11
d jour dd → 15
H Heure (0-23) HH → 14
h Heure (1-12) hh → 02
m Minute mm 30
s second ss → 45
S Milliseconde SSS → 123
E Jour de la semaine E → mer.
a AM/PM a PM

Bonnes pratiques

Réutiliser les formateurs

Comme DateTimeFormatter est thread-safe, il est recommandé de définir les formateurs couramment utilisés comme constantes :

Exemple

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

Exemple complet :

Exemple

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. Exemple de LocalDate
        LocalDate currentDate = LocalDate.now();
        System.out.println(Date actuelle : + currentDate);
       
        LocalDate specificDate = LocalDate.of(2023, 5, 20);
        System.out.println(Date spécifique : + specificDate);

        // 2. Exemple de LocalTime
        LocalTime currentTime = LocalTime.now();
        System.out.println(Heure actuelle : + currentTime);
       
        LocalTime specificTime = LocalTime.of(14, 30, 15);
        System.out.println(Heure spécifique : + specificTime);

        // 3. Exemple de LocalDateTime
        LocalDateTime currentDateTime = LocalDateTime.now();
        System.out.println(Date et heure actuelles : + currentDateTime);
       
        LocalDateTime specificDateTime = LocalDateTime.of(2023, 5, 20, 14, 30, 15);
        System.out.println(Date et heure spécifiques : + specificDateTime);

        // 4. Exemple de DateTimeFormatter
        // Formatage de base
        DateTimeFormatter basicFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        System.out.println(Formatage de base : + currentDate.format(basicFormatter));

        // Formatage chinois
        DateTimeFormatter chineseFormatter = DateTimeFormatter.ofPattern(yyyy-MM-dd, Locale.CHINA);
        System.out.println(Date chinoise : + currentDate.format(chineseFormatter));

        // Formatage chinois avec jour de la semaine
        DateTimeFormatter weekFormatter = DateTimeFormatter.ofPattern(yyyy-MM-dd EEEE, Locale.CHINA);
        System.out.println(Date chinoise avec jour de la semaine : + currentDate.format(weekFormatter));

        // Formatage de l'heure
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern(HH:mm:ss);
        System.out.println(Heure chinoise : + currentTime.format(timeFormatter));

        // Formatage de la date et de l'heure
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println(Date et heure standard : + currentDateTime.format(dateTimeFormatter));

        // Analyser la date
        String dateStr = "2023-05-20";
        LocalDate parsedDate = LocalDate.parse(dateStr, basicFormatter);
        System.out.println(Date analysée : + parsedDate);

        // Analyser la date chinoise
        String chineseDateStr = 2023-05-20;
        LocalDate parsedChineseDate = LocalDate.parse(chineseDateStr, chineseFormatter);
        System.out.println(Date chinoise analysée : + parsedChineseDate);
    }
}

La sortie est :

当前日期: 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

Gestion des exceptions d'analyse

Vous devez gérer les exceptions possibles lors de l'analyse des chaînes :

Exemple

try {
    LocalDateTime dateTime = LocalDateTime.parse("2023-11-15", formatter);
} catch (DateTimeParseException e) {
    System.err.println(Impossible d'analyser la date/heure : + e.getMessage());
}

Tenez compte des fuseaux horaires

Si vous devez gérer les fuseaux horaires, vous pouvez utiliserZonedDateTimeet des modèles de fuseau horaire spécifiques :

Exemple

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

Résumé

DateTimeFormatter est un outil puissant pour le formatage et l'analyse dans l'API date-heure de Java 8. Comparé à l'ancien SimpleDateFormat, il est plus sûr, plus flexible et plus facile à utiliser. Maîtriser DateTimeFormatter vous permet de gérer plus efficacement diverses exigences de format de date-heure.

Retenez les points clés :

  • Utilisez des formateurs prédéfinis pour les formats courants
  • Utilisez ofPattern() pour créer des formats personnalisés
  • Tenez compte de la localisation et des exigences de fuseau horaire
  • Réutiliser des instances de formateur sûres pour les threads
  • Gérer correctement les exceptions d'analyse
Autres extensions