Aller au contenu

Jetons de format de date

Il y a deux familles largement utilisées de chaînes de format de date et elles se chevauchent juste assez pour être dangereuses. strftime — de C, et hérité de Python, Ruby, PHP et GNU date — utilise des jetons de pourcentage comme %Y. Unicode LDML, utilisé par ICU, Java, moment et dayjs, utilise des lettres répétées comme yyyy. Dans LDML, MM est un mois et mm est une minute ; obtenir cette paire à l'envers est le bug classique.

Chaque ligne ci-dessous est rendue pour le même instant : lundi 9 mars 2026, 14:05:07 UTC. Cette date est choisie pour que rien ne se cache — un jour et un mois à un seul chiffre exposent le remplissage avec zéro, l'heure de l'après-midi rend les horloges 12 et 24 heures visuellement différentes, et le jour de la semaine est sans ambiguïté.

Une colonne d'équivalent vide signifie que l'autre dialecte n'a pas de jeton unique pour elle et vous devez composer la valeur vous-même. La suite de tests rend les champs de calendrier avec les fonctions de date propres à la plateforme et les compare à cette table, donc les exemples ne peuvent pas s'écarter de la réalité.

Année

4
strftimeLDMLChampRend comme
%YyyyyAnnée à quatre chiffres2026
%yyyAnnée à deux chiffresAmbigu par la construction. Évitez-le dans tout ce qui est stocké.26
%CSiècle — l'année divisée par 10020
%GYYYYAnnée de numérotation de semaine ISODiffère de l'année calendaire autour du Nouvel An. À utiliser avec le numéro de semaine ISO uniquement.2026

Mois

4

En LDML, MM est le mois et mm est la minute.

strftimeLDMLChampRend comme
%mMMMois, rembourré de zéro03
%-mMMois, pas de rembourrage3
%bMMMNom du mois abrégéMar
%BMMMMNom complet du moisMarch

Jour et jour de la semaine

8

En LDML, dd est le jour du mois et DDD est le jour de l'année.

strftimeLDMLChampRend comme
%dddJour du mois, rembourré de zéro09
%-ddJour du mois, pas de rembourrage9
%eJour du mois, rembourré d'espace 9
%jDDDJour de l'année, 001–366068
%aEEENom du jour de la semaine abrégéMon
%AEEEENom complet du jour de la semaineMonday
%uJour de la semaine en nombre, lundi est 1%w numérote les mêmes jours à partir de dimanche comme 0.1
%VwwNuméro de semaine ISO, semaines commençant lundi11

Temps

8
strftimeLDMLChampRend comme
%HHHHeure sur l'horloge 24 heures14
%-HHHeure, pas de rembourrage14
%IhhHeure sur l'horloge 12 heures02
%MmmMinute05
%SssDeuxième07
%3NSSSMillisecondes000
%paAM ou PMPM
%sHorodatage Unix — secondes depuis 1970-01-01 UTC1773065107

Fuseau horaire

3

Un décalage est un nombre ; un nom de zone est une règle. Seul le nom survit à un changement d'heure d'été.

strftimeLDMLChampRend comme
%zZZDécalage UTC, pas de deux-points+0000
%:zXXXDécalage UTC avec un deux-points, comme ISO 8601 le veut+00:00
%ZzzzAbréviation de fuseau horaireLes abréviations ne sont pas uniques — CST est au moins trois zones différentes.UTC

Combinaisons courantes

7

Construit à partir des jetons ci-dessus — aucune bibliothèque nécessaire.

strftimeLDMLChampRend comme
%Fyyyy-MM-ddDate ISO2026-03-09
%THH:mm:ssHeure 24 heures14:05:07
%FT%T%:zyyyy-MM-dd'T'HH:mm:ssXXXHorodatage ISO 8601 completLe format à stocker. Se trie en tant que texte, sans ambiguïté quant au décalage.2026-03-09T14:05:07+00:00
%a, %d %b %Y %T %zEEE, dd MMM yyyy HH:mm:ss ZZRFC 2822 — en-têtes de courrier et HTTP plus anciensMon, 09 Mar 2026 14:05:07 +0000
%m/%d/%YMM/dd/yyyyConvention États-Unis, mois d'abord03/09/2026
%d.%m.%Ydd.MM.yyyyConvention européenne, jour d'abord09.03.2026
%%''Un signe pour cent littéral%

FAQ

Quelle est la différence entre yyyy et YYYY ?
En LDML, yyyy est l'année calendaire et YYYY est l'année de numérotation de semaine ISO. Elles diffèrent pour quelques jours chaque janvier : 2027-01-01 tombe dans la semaine ISO 53 de 2026, donc YYYY lit 2026 là. Utiliser YYYY par accident produit un bug qui apparaît une fois par an puis disparaît, c'est pourquoi il est si difficile à attraper.
Pourquoi mon mois s'affiche-t-il en minutes ?
Parce que vous êtes dans un dialecte LDML et utilisé mm au lieu de MM. LDML est sensible à la casse : M est le mois, m est la minute, D est le jour de l'année, d est le jour du mois. strftime a le même piège à un endroit différent — %M est les minutes et %m est le mois.
Comment obtenir un nombre rembourré ou non rembourré ?
En strftime, l'extension GNU %-d supprime le remplissage, donc %d est 09 et %-d est 9. Dans LDML, le nombre de lettres définit la largeur directement : d est 9 et dd est 09. Aucun n'est portable — %-d n'existe pas sur chaque plateforme.
Dans quel format dois-je stocker les dates ?
ISO 8601 avec un décalage explicite — 2026-03-09T14:05:07+00:00. Il se trie correctement en tant que texte, il est sans ambiguïté quant au décalage, et chaque langage l'analyse. Stockez cela et formatez pour l'affichage au dernier moment possible ; une date locale stockée sans décalage est une perte d'informations irrécupérable.