CodeGym /Cours /JAVA 25 SELF /Formatage et analyse des dates : DateTimeFormatter

Formatage et analyse des dates : DateTimeFormatter

JAVA 25 SELF
Niveau 13 , Leçon 4
Disponible

1. DateTimeFormatter : qu’est-ce que c’est et à quoi ça sert

Dans les applications réelles, les dates vivent rarement uniquement dans le code. En général, il faut :

  • Les convertir en chaîne pour afficher dans la console, à l’écran ou dans un fichier (par exemple, "01.06.2025 14:30").
  • Analyser une chaîne, c’est-à-dire transformer une chaîne saisie par l’utilisateur ou provenant d’un fichier en objet date/heure.

Pour cela, Java propose un outil puissant et pratique — la classe java.time.format.DateTimeFormatter.

On peut dire que DateTimeFormatter est un traducteur entre les objets temporels (LocalDate, LocalDateTime, ZonedDateTime, Instant, etc.) et les chaînes. Il sait :

  • Transformer des objets date/heure en chaînes dans le format voulu (format — formatage).
  • Transformer des chaînes en objets date/heure (parse — analyse).

2. Formatters standard : rapide et simple

Java a préparé pour nous un ensemble de formatters standard qui couvrent les formats ISO les plus populaires (normes internationales pour les dates et heures).

En voici quelques-uns :

Formatter Exemple de chaîne Description
DateTimeFormatter.ISO_LOCAL_DATE
2025-06-01 Date uniquement (année-mois-jour)
DateTimeFormatter.ISO_LOCAL_TIME
14:30:00 Heure uniquement (heures:minutes:secondes)
DateTimeFormatter.ISO_LOCAL_DATE_TIME
2025-06-01T14:30:00 Date et heure sans fuseau horaire
DateTimeFormatter.ISO_ZONED_DATE_TIME
2025-06-01T14:30:00+03:00[Europe/Minsk] Date, heure et fuseau horaire

Exemple d’utilisation d’un formatter standard

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class FormatterDemo {
    public static void main(String[] args) {
        LocalDate date = LocalDate.now();
        // Formater une date en chaîne
        String text = date.format(DateTimeFormatter.ISO_LOCAL_DATE);
        System.out.println(text); // Par exemple, 2025-06-01

        // Analyser la chaîne pour retrouver la date
        LocalDate parsed = LocalDate.parse("2025-06-01", DateTimeFormatter.ISO_LOCAL_DATE);
        System.out.println(parsed); // 2025-06-01
    }
}

Analogie

Si Java était un café, les formatters standard seraient « americano », « latte » et « espresso ». Rapide, standard — mais parfois on veut quelque chose de spécial !

3. Modèles personnalisés : DateTimeFormatter.ofPattern

Parfois, les formats standard ne suffisent pas. Par exemple, on veut afficher "01.06.2025 14:30" et non "2025-06-01T14:30:00". Pour cela, nous pouvons créer notre propre modèle avec la méthode DateTimeFormatter.ofPattern(String pattern).

Syntaxe des modèles

Le modèle utilise des lettres spéciales :

  • y — année (yyyy2025)
  • M — mois (MM06)
  • d — jour (dd01)
  • H — heure (format 24 h, HH14)
  • m — minutes (mm30)
  • s — secondes (ss00)

Exemples de modèles

Modèle Exemple de résultat
"dd.MM.yyyy"
01.06.2025
"yyyy/MM/dd"
2025/06/01
"dd.MM.yyyy HH:mm"
01.06.2025 14:30
"yyyy-MM-dd HH:mm:ss"
2025-06-01 14:30:00
"d MMMM yyyy"
1 iyunya 2025 (avec la locale russe)

Exemple : formatage de la date et de l’heure

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
    }
}

Exemple : analyser une chaîne en date

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
    }
}

Attention : le modèle doit correspondre exactement à la chaîne ! S’il y a des secondes dans la chaîne — ajoutez :ss au modèle.

4. Formatage : transformer une date/heure en chaîne

Schéma général

  1. Créer l’objet nécessaire (LocalDate, LocalDateTime, ZonedDateTime, etc.).
  2. Créer ou choisir le formatter nécessaire.
  3. Appeler sur l’objet la méthode format(DateTimeFormatter) pour obtenir une chaîne.

Exemple : afficher une date dans différents formats

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);

        // ISO standard
        System.out.println(date.format(DateTimeFormatter.ISO_LOCAL_DATE)); // 2025-06-01

        // Format personnalisé
        DateTimeFormatter rusFormat = DateTimeFormatter.ofPattern("dd.MM.yyyy");
        System.out.println(date.format(rusFormat)); // 01.06.2025

        // Style anglais
        DateTimeFormatter usFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy");
        System.out.println(date.format(usFormat)); // 06/01/2025
    }
}

Formatage de l’heure

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. Analyse : transformer une chaîne en date/heure

Schéma général

  1. Obtenir une chaîne (par exemple, saisie par l’utilisateur).
  2. Créer un formatter avec le même modèle que la chaîne.
  3. Appeler la méthode statique parse() ou la méthode parse() de l’instance de formatter.

Exemple : analyser une date

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
    }
}

Exemple : analyser une date et une heure

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. Gestion des erreurs d’analyse

L’analyse est délicate. Si la chaîne ne correspond pas au modèle, Java lèvera une exception DateTimeParseException. C’est une situation courante, par exemple si l’utilisateur a saisi une date incorrecte.

Exemple : gestion des erreurs lors de l’analyse

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"; // Date incorrecte
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
        try {
            LocalDate date = LocalDate.parse(input, formatter);
            System.out.println(date);
        } catch (DateTimeParseException ex) {
            System.out.println("Erreur d’analyse : " + ex.getMessage());
        }
    }
}

Important : traitez toujours ce type d’erreurs lorsque vous travaillez avec des saisies utilisateur !

7. Pratique : conversion des dates pour l’utilisateur

Supposons que, dans notre application pédagogique, l’utilisateur saisisse sa date de naissance au format "jj.MM.aaaa", et que le programme doive l’afficher au format "yyyy/MM/dd", ainsi que le jour de la semaine.

Exemple

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("Saisissez votre date de naissance (jj.MM.aaaa) : ");
        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("Votre date dans le nouveau format : " + formatted);
            System.out.println("Jour de la semaine : " + birthday.getDayOfWeek()); // Par exemple, SATURDAY
        } catch (DateTimeParseException ex) {
            System.out.println("Erreur : format de date incorrect !");
        }
    }
}

8. Localisation : comment la langue influence le formatage

Avec DateTimeFormatter, on peut non seulement changer l’ordre des nombres, mais aussi afficher le mois en toutes lettres, le jour de la semaine, etc. La locale (langue et région) est prise en compte.

Exemple : afficher le mois en toutes lettres en russe

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 iyunya 2025
    }
}

Exemple : locale anglaise

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
    }
}

Astuce : si vous souhaitez que le mois et le jour de la semaine soient dans la langue voulue — indiquez la locale explicitement !

9. Erreurs typiques lors du formatage et de l’analyse des dates

Erreur n° 1 : le modèle ne correspond pas à la chaîne.
Si la chaîne est "01.06.2025 14:30" mais le modèle "dd.MM.yyyy", l’analyse échouera. Le modèle doit correspondre exactement à la chaîne.

Erreur n° 2 : confusion des symboles du modèle.
MM — mois, mm — minutes. Si vous écrivez "dd.mm.yyyy", Java pensera que vous voulez les minutes et lèvera une erreur. Pour le mois, utilisez toujours des M majuscules.

Erreur n° 3 : exceptions non gérées lors de l’analyse.
Si vous ne capturez pas DateTimeParseException, le programme peut s’arrêter brutalement en cas de saisie invalide. Gérez toujours ces erreurs.

Erreur n° 4 : locale non précisée lors de l’utilisation de mots.
Si vous utilisez un modèle avec le mois en toutes lettres (MMMM) et que la locale n’est pas indiquée, Java peut utiliser la langue par défaut (par exemple, l’anglais). Indiquez toujours explicitement la locale souhaitée.

Erreur n° 5 : utilisation des anciennes classes (SimpleDateFormat, Date) dans les nouveaux projets.
À retenir : dans du code moderne, utilisez uniquement java.time et DateTimeFormatter.

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION