DateTime en ISO 8601 en C# : guide complet avec réponses aux questions fréquentes

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Comment transformer DateTime en chaîne ISO 8601 en C# ? Un problème qui tourmente même les développeurs expérimentés

\n\n

Avez-vous déjà été confronté à une situation où votre API renvoie une date au format "2023-01-15T10:30:00", mais le client ne la comprend pas ? Ou, à l'inverse, vous recevez une date d'un service externe qui ressemble à "2023-01-15T10:30:00+03:00", et votre analyseur plante ? Cela vous dit quelque chose ? Si vous travaillez avec C# et l'objet DateTime, la question de l'obtention d'une chaîne ISO 8601 est un classique. Sur Stack Overflow, cette question a recueilli des milliers de vues, et ce n'est pas pour rien. Aujourd'hui, nous allons enfin comprendre comment convertir correctement DateTime en chaîne au format ISO 8601, en évitant les pièges typiques.

\n\n

Nous ne nous contenterons pas de montrer quelques lignes de code. Nous allons détailler le format C# DateTime pour ISO 8601, examiner la gestion des fuseaux horaires, des millisecondes et répondre aux questions les plus fréquentes. C'est parti !

\n\n

Qu'est-ce que l'ISO 8601 et pourquoi est-ce important ?

\n\n

L'ISO 8601 est une norme internationale pour la représentation de la date et de l'heure. Elle ressemble à ceci : 2023-12-25T14:30:00.0000000+03:00. Les principales caractéristiques sont :

\n
    \n
  • Séparateur T entre la date et l'heure.
  • \n
  • Fuseau horaire indiqué à la fin (Z pour UTC ou un décalage comme +05:00).
  • \n
  • Partie fractionnaire des secondes (millisecondes, ticks).
  • \n
\n

Pourquoi est-ce nécessaire ? JSON, XML, API REST, bases de données — partout où une transmission univoque d'un instant dans le temps est nécessaire, sans lien avec la culture locale du serveur. Un mauvais format — et votre analyseur de l'autre côté pourrait ignorer les heures ou confondre le jour et le mois. C'est pourquoi la norme de date ISO 8601 en C# est une compétence indispensable pour tout développeur back-end.

\n\n

La méthode la plus simple : DateTime.ToString() avec le format "o"

\n\n

En C#, il existe un spécificateur de format intégré pour le format aller-retour (round-trip) — c'est la lettre "o" (minuscule). Il fournit une chaîne ISO 8601 complète avec une précision maximale.

\n\n
DateTime now = DateTime.Now;\nstring isoString = now.ToString("o");\nConsole.WriteLine(isoString);\n// Exemple de sortie : 2023-12-25T14:30:00.1234567+03:00
\n\n

C'est la façon la plus simple d'obtenir une chaîne ISO 8601 en C#. Mais il y a un détail : si votre DateTime a Kind = Unspecified, la fin de la chaîne n'indiquera pas le fuseau horaire. Cela peut poser problème pour les analyseurs stricts. La solution est d'utiliser toujours DateTimeOffset ou de définir explicitement le Kind.

\n\n

Comment obtenir une chaîne ISO 8601 sans millisecondes ?

\n\n

Parfois, les millisecondes (ou même les ticks) ne sont pas nécessaires. Par exemple, pour les logs ou les dates simples. Utilisez un format personnalisé :

\n\n
DateTime now = DateTime.UtcNow;\nstring isoShort = now.ToString("yyyy-MM-ddTHH:mm:ssK");\nConsole.WriteLine(isoShort);\n// Exemple : 2023-12-25T14:30:00Z
\n\n

Ici, K est le spécificateur de fuseau horaire. Pour UTC, il donne Z ; pour l'heure locale, il donne le décalage.

\n\n

Le problème des fuseaux horaires : DateTime vs DateTimeOffset

\n\n

La principale difficulté pour les développeurs est la confusion entre DateTime et DateTimeOffset. Si vous voulez obtenir une date ISO 8601 en C# qui sera interprétée sans ambiguïté partout dans le monde, utilisez DateTimeOffset. Il contient toujours le décalage par rapport à UTC.

\n\n
DateTimeOffset nowOffset = DateTimeOffset.Now;\nstring isoOffset = nowOffset.ToString("o");\nConsole.WriteLine(isoOffset);\n// Exemple : 2023-12-25T14:30:00.1234567+03:00
\n\n

Si vous travaillez avec DateTime, vérifiez toujours sa propriété Kind :

\n
    \n
  • DateTimeKind.Utc — donne Z à la fin.
  • \n
  • DateTimeKind.Local — donne le décalage local (par exemple, +03:00).
  • \n
  • DateTimeKind.Unspecified — ne donne rien.

Blogs

Book Recommendations