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é

FormeExemple
Date2026-04-20
Date + heure2026-04-20T14:35:12
Avec millisecondes2026-04-20T14:35:12.482
Avec offset UTC2026-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éesInstant
API REST avec offset expliciteOffsetDateTime
Rendez-vous lié à un lieuZonedDateTime
Affichage utilisateur localLocalDateTime

É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.