Menu

Format DateTime en C# : formats standard et personnalisés, culture, ISO 8601

Comment formater un DateTime en chaîne en C# : les chaînes de format standard (d, D, o, s, u, t), les modèles personnalisés comme yyyy-MM-dd HH:mm:ss, un tableau complet des spécificateurs, l'effet de la culture sur la sortie, l'aller-retour ISO 8601 avec "o", et les erreurs mm ou MM et hh ou HH.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

DateTime.ToString(format) transforme une date en texte. Le format est soit une chaîne de format standard (une seule lettre comme d ou o, dont le modèle exact vient de la culture), soit un modèle personnalisé construit à partir de spécificateurs comme yyyy, MM et HH. Les mêmes chaînes fonctionnent dans l'interpolation, $"{date:yyyy-MM-dd}", et dans string.Format.

Sortie :

2026-10-09
2026-10-09 18:30:07
09/10/2026
Oct 9, 2026
Friday, October 9
6:30 PM
18:30:07.045
Shipped 2026-10-09 at 18:30

Les exemples de cette page passent CultureInfo.InvariantCulture pour que la sortie soit la même sur toutes les machines ; sans elle, ToString utilise la culture courante, qui peut changer les noms de mois, les séparateurs et même le calendrier.

Spécificateurs de format personnalisés

Un format personnalisé est un modèle dans lequel certaines lettres représentent des parties de la date. Ils sont sensibles à la casse : M est le mois et m la minute, H l'heure sur 24 heures et h l'heure sur 12 heures.

SpécificateurSignificationExemple pour 2026-10-09 18:30:07.045
yyyyAnnée, 4 chiffres2026
yyAnnée, 2 chiffres26
MMMMNom complet du moisOctober
MMMNom abrégé du moisOct
MMMois, 2 chiffres10
MMois, 1 ou 2 chiffres10
ddddNom complet du jourFriday
dddNom abrégé du jourFri
ddJour du mois, 2 chiffres09
dJour du mois, 1 ou 2 chiffres (dans un modèle)9
HHHeure, de 00 à 2318
HHeure, de 0 à 2318
hhHeure, de 01 à 1206
hHeure, de 1 à 126
mmMinute, 2 chiffres30
ssSeconde, 2 chiffres07
fffMillisecondes045
fffffffTicks (sept chiffres fractionnaires)0450000
ttIndicateur AM/PMPM
zzzDécalage par rapport à UTC (DateTimeOffset ou heure locale)+02:00
KInformation de fuseau : Z, un décalage ou rienZ (pour une valeur UTC)
/Le séparateur de date de la culture/ ou . ou -
:Le séparateur d'heure de la culture:
'text' ou \cTexte ou caractère littéral'at'

Tout autre caractère est copié tel quel. Cela inclut les lettres qui ne sont pas des spécificateurs, c'est ainsi que "YYYY-DD" affiche discrètement YYYY-DD : il n'existe pas de spécificateur Y ou D en majuscule dans .NET.

Une lettre seule est lue comme un format standard, pas personnalisé : ToString("d") est le modèle de date courte, pas le numéro du jour. Pour obtenir seulement le jour, écrivez ToString("%d") ou utilisez la propriété Day.

Sortie :

10/09/2026
9
20261009_183007
Week of Oct 9
18h30
2026-10-09T18:30:07
YYYY-DD

Chaînes de format standard

Les formats standard sont des lettres uniques dont le modèle réel est défini par la culture. C'est le bon choix pour le texte montré aux utilisateurs, car chaque culture reçoit ses propres conventions gratuitement.

Sortie :

d  10/09/2026
D  Friday, 09 October 2026
f  Friday, 09 October 2026 18:30
g  10/09/2026 18:30
G  10/09/2026 18:30:07
M  October 09
Y  2026 October
t  18:30
T  18:30:07
o  2026-10-09T18:30:07.0000000Z
s  2026-10-09T18:30:07
u  2026-10-09 18:30:07Z
r  Fri, 09 Oct 2026 18:30:07 GMT
en-US d: 10/9/2026, D: Friday, October 9, 2026
CodeNomDépend de la culture ?
d / DDate courte / longueOui
t / THeure courte / longueOui
f / FDate longue avec heure courte / longueOui
g / GDate courte avec heure courte / longueOui
MMois et jourOui
YAnnée et moisOui
oAller-retour ISO 8601, 7 chiffres fractionnaires, fuseauNon
sISO 8601 triable, sans fractions ni fuseauNon
uUniversel triable, se termine par ZNon
rRFC 1123, pour les en-têtes HTTPNon

o, s, u et r produisent le même texte dans toutes les cultures, ce qui les rend sûrs pour les logs, les noms de fichiers et l'échange de données. Notez que sur un DateTime, u et r ne convertissent pas la valeur en UTC ; ils l'affichent telle quelle en l'étiquetant comme UTC, donc appelez d'abord ToUniversalTime() (ou utilisez DateTime.UtcNow) si la valeur est locale. (Sur un DateTimeOffset, ils convertissent.)

La culture change la sortie

Les formats standard, les noms de mois et de jours, et les séparateurs / et : viennent tous de la culture. Passez-en une en second argument de ToString :

Sortie :

en-US  10/9/2026
en-GB  09/10/2026
de-DE  09.10.2026
fr-FR  09/10/2026
ja-JP  2026/10/09
Freitag, 9. Oktober 2026
vendredi 9 octobre 2026
09.10.2026
09/10/2026

Les données de culture ne sont pas figées. .NET sous Linux et macOS les lit dans la bibliothèque ICU installée sur le système, et depuis .NET 5, .NET sous Windows 10 et plus fait de même (.NET Framework utilise les données NLS propres à Windows) ; un modèle peut donc changer légèrement d'une version ou d'une plateforme à l'autre : les versions récentes d'ICU, par exemple, placent une espace insécable fine plutôt qu'une espace simple avant « PM » dans le format d'heure courte américain, et certaines donnent les dates courtes espagnoles sans le zéro initial. C'est une raison de plus de ne jamais analyser du texte formaté pour l'affichage.

Deux règles en découlent. Pour le texte que lit une personne, formatez avec sa culture (sur un serveur, celle de la requête, pas celle du serveur) et préférez les formats standard, pour qu'un lecteur allemand voie 09.10.2026 et un lecteur américain 10/9/2026. Pour le texte que lit un programme, utilisez CultureInfo.InvariantCulture et un modèle non ambigu comme yyyy-MM-dd ou o. Une date écrite avec la culture courante et analysée sur une autre machine est une source classique d'inversion entre jours et mois.

ISO 8601 et l'aller-retour avec "o"

Le format aller-retour "o" écrit chaque tick plus l'information de fuseau, donc analyser le texte redonne exactement le même DateTime, y compris son Kind :

Sortie :

2026-10-09T18:30:07.0450000Z
2026-10-09T18:30:07.0450000
2026-10-09T20:30:07.0000000+02:00
True
Utc
2026-10-09T18:30:07Z
2026-10-09 20:30 +02:00

Le suffixe Z marque l'UTC ; un DateTime dont le Kind est Unspecified n'a pas de suffixe ; une heure locale ou un DateTimeOffset reçoit son décalage (+02:00). Analysez avec DateTimeStyles.RoundtripKind pour que le Kind soit conservé. Les sérialiseurs JSON, les bases de données et le Date de JavaScript lisent tous ce format.

Formater un TimeSpan

TimeSpan a son propre ensemble, plus réduit, de spécificateurs personnalisés : d (jours), hh, mm, ss et fff. Contrairement à DateTime, chaque caractère littéral, y compris : et ., doit être échappé par une barre oblique inverse ou mis entre apostrophes :

Sortie :

1.03:25:09.1200000
1.03:25:09.1200000
03:25:09
1.03:25
25:09.120
27:25

Dans un format TimeSpan, hh est la composante des heures (0 à 23), donc une durée de 27 heures s'affiche 03. Pour des totaux supérieurs à un jour, calculez à partir de TotalHours comme dans la dernière ligne. elapsed.ToString("hh:mm") sans la barre oblique inverse lève une FormatException.

Erreurs courantes

  • mm pour le mois. "yyyy-mm-dd" affiche les minutes au milieu : 2026-30-09. Le mois s'écrit MM.
  • hh sans tt. "hh:mm" est une horloge sur 12 heures sans AM ni PM, donc 06:30 est ambigu. Utilisez HH pour l'heure sur 24 heures.
  • YYYY et DD. Ce ne sont pas des spécificateurs dans .NET ; ils sont affichés littéralement. Utilisez yyyy et dd.
  • / dans un modèle pour des données. C'est le séparateur de date de la culture. Mettez-le entre apostrophes ou utilisez la culture invariante.
  • ToString() par défaut dans des logs ou des fichiers. Le format dépend de la machine. Passez un format et une culture.
  • Heure locale étiquetée comme UTC. "u", "r" et un 'Z' écrit à la main ne convertissent pas ; convertissez d'abord.
  • Analyser avec un autre modèle que celui utilisé pour écrire. Gardez les chaînes de format des données dans une seule constante et utilisez-la à la fois avec ToString et ParseExact.

Questions fréquentes

Comment formater un DateTime en yyyy-MM-dd en C# ?

date.ToString("yyyy-MM-dd") donne 2026-10-09. Dans une chaîne interpolée, écrivez $"{date:yyyy-MM-dd}". Ajoutez " HH:mm:ss" pour l'heure au format 24 heures. Passez CultureInfo.InvariantCulture en second argument quand le texte est destiné à un fichier ou à un autre programme, pour que le calendrier, les noms de mois et les séparateurs ne dépendent jamais de la machine.

Quelle est la différence entre mm et MM dans les formats de date C# ?

MM est le mois (01 à 12) et mm la minute (00 à 59). Le format est sensible à la casse, donc yyyy-mm-dd affiche les minutes à la place du mois, un bug facile à manquer quand on ne regarde qu'une seule valeur. De même, HH est l'heure sur 24 heures et hh l'heure sur 12 heures.

Comment formater un DateTime en ISO 8601 en C# ?

Utilisez le format aller-retour "o" : DateTime.UtcNow.ToString("o") donne 2026-10-09T18:30:07.0450000Z, avec sept chiffres fractionnaires et un Z pour UTC, ou un décalage pour les heures locales. "s" donne la forme triable plus courte, sans fractions ni fuseau, et "yyyy-MM-ddTHH:mm:ssZ" est une variante personnalisée courante.

Comment afficher AM et PM dans un format de date C# ?

Utilisez hh ou h pour l'horloge sur 12 heures et tt pour l'indicateur AM/PM : date.ToString("h:mm tt", CultureInfo.GetCultureInfo("en-US")) donne 6:30 PM. L'indicateur vient de la culture, et certaines cultures n'en ont pas ; passez donc une culture explicitement quand vous avez besoin de AM et PM.

Pourquoi mon format de date affiche-t-il des points au lieu de barres obliques ?

Dans une chaîne de format, / n'est pas une barre oblique littérale mais le séparateur de date de la culture, et : est le séparateur d'heure de la culture. Sur une machine allemande, dd/MM/yyyy affiche 09.10.2026. Mettez le caractère entre apostrophes pour l'imposer, dd'/'MM'/'yyyy, ou formatez avec CultureInfo.InvariantCulture.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER