Obtenir la date et l'heure actuelles au format ISO 8601 en Java
Le format ISO 8601 est la norme universelle pour représenter dates et heures : sans ambiguïté, triable par ordre lexicographique, parfait pour les logs, les APIs REST et le stockage en base de données. Java 8 fournit tout le nécessaire pour le générer proprement.
Le format ISO 8601 en résumé
| Forme | Exemple |
|---|---|
| Date | 2026-04-20 |
| Date + heure | 2026-04-20T14:35:12 |
| Avec millisecondes | 2026-04-20T14:35:12.482 |
| Avec offset UTC | 2026-04-20T14:35:12+02:00 |
| UTC strict (Zulu) | 2026-04-20T12:35:12Z |
| Avec fuseau nommé | 2026-04-20T14:35:12+02:00[Europe/Paris] |
La plus simple : Instant
Instant représente un point dans le temps en UTC. Son toString() produit directement un ISO 8601 valide avec le suffixe Z :
import java.time.Instant;
Instant maintenant = Instant.now();
System.out.println(maintenant);
// 2026-04-20T12:35:12.482Z
Parfait pour des logs ou des timestamps stockés en base — toujours à utiliser quand vous n'avez pas besoin du fuseau local.
Avec fuseau local : OffsetDateTime
import java.time.OffsetDateTime;
OffsetDateTime maintenant = OffsetDateTime.now();
System.out.println(maintenant);
// 2026-04-20T14:35:12.482+02:00
Affiche l'heure locale plus l'offset UTC. Idéal pour les APIs REST qui doivent refléter le fuseau du client.
Avec fuseau nommé : ZonedDateTime
import java.time.ZonedDateTime;
import java.time.ZoneId;
ZonedDateTime maintenant = ZonedDateTime.now(ZoneId.of("Europe/Paris"));
System.out.println(maintenant);
// 2026-04-20T14:35:12.482+02:00[Europe/Paris]
Ajoute le nom du fuseau entre crochets. Utile pour stocker un rendez-vous lié à un lieu.
Contrôler le format précisément
Les DateTimeFormatter.ISO_* pré-définis couvrent les cas les plus courants :
import java.time.*;
import java.time.format.DateTimeFormatter;
ZonedDateTime now = ZonedDateTime.now();
System.out.println(now.format(DateTimeFormatter.ISO_DATE));
// 2026-04-20+02:00
System.out.println(now.format(DateTimeFormatter.ISO_LOCAL_DATE));
// 2026-04-20
System.out.println(now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
// 2026-04-20T14:35:12.482
System.out.println(now.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
// 2026-04-20T14:35:12.482+02:00
System.out.println(now.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
// 2026-04-20T14:35:12.482+02:00[Europe/Paris]
System.out.println(now.format(DateTimeFormatter.ISO_INSTANT));
// 2026-04-20T12:35:12.482Z
Sans les millisecondes
Pour obtenir une sortie sans fraction de seconde :
Instant sansMs = Instant.now().truncatedTo(java.time.temporal.ChronoUnit.SECONDS);
System.out.println(sansMs);
// 2026-04-20T12:35:12Z
Format personnalisé jusqu'à la minute
Si vous voulez 2026-04-20T14:35 (précision minute uniquement) :
DateTimeFormatter minuteFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm");
String s = LocalDateTime.now().format(minuteFormat);
System.out.println(s);
// 2026-04-20T14:35
Parser une chaîne ISO 8601
Les mĂŞmes formatteurs servent pour le parsing :
Instant i = Instant.parse("2026-04-20T12:35:12Z");
OffsetDateTime o = OffsetDateTime.parse("2026-04-20T14:35:12+02:00");
ZonedDateTime z = ZonedDateTime.parse("2026-04-20T14:35:12+02:00[Europe/Paris]");
Quelle classe choisir ?
| Contexte | À utiliser |
|---|---|
| Timestamp technique, logs, base de données | Instant |
| API REST avec offset explicite | OffsetDateTime |
| Rendez-vous lié à un lieu | ZonedDateTime |
| Affichage utilisateur local | LocalDateTime |
Éviter les anciennes APIs
java.util.Date et SimpleDateFormat restent utilisables mais sont à éviter : pas thread-safe, mutables, confuses sur les fuseaux horaires. Pour tout nouveau code, java.time est la seule voie recommandée.
En une ligne, pour 95 % des besoins : Instant.now().toString() produit un ISO 8601 en UTC, thread-safe, sans effort.