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 |
|---|---|---|
|
2025-06-01 | Date uniquement (année-mois-jour) |
|
14:30:00 | Heure uniquement (heures:minutes:secondes) |
|
2025-06-01T14:30:00 | Date et heure sans fuseau horaire |
|
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 (yyyy — 2025)
- M — mois (MM — 06)
- d — jour (dd — 01)
- H — heure (format 24 h, HH — 14)
- m — minutes (mm — 30)
- s — secondes (ss — 00)
Exemples de modèles
| Modèle | Exemple de résultat |
|---|---|
|
01.06.2025 |
|
2025/06/01 |
|
01.06.2025 14:30 |
|
2025-06-01 14:30:00 |
|
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
- Créer l’objet nécessaire (LocalDate, LocalDateTime, ZonedDateTime, etc.).
- Créer ou choisir le formatter nécessaire.
- 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
- Obtenir une chaîne (par exemple, saisie par l’utilisateur).
- Créer un formatter avec le même modèle que la chaîne.
- 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.
GO TO FULL VERSION