Přeskočit na obsah

Tokeny formátu data

Existují dvě široce používané rodiny řetězců formátu data a překrývají se právě dost na to, aby byly nebezpečné. strftime — z C a zděděno Python, Ruby, PHP a GNU date — používá procent tokeny jako %Y. Unicode LDML, používaný ICU, Java, moment a dayjs, používá opakované písmena jako yyyy. V LDML je MM měsíc a mm minuta; získání tohoto páru zpět je klasická chyba.

Každý řádek níže je vykreslen pro stejný okamžik: pondělí 9. března 2026, 14:05:07 UTC. Toto datum je vybráno tak, aby nic neschovávalo — jednociferný den a měsíc odhalují doplňování nulami, odpolední hodina činí 12- a 24hodinové hodiny viditelně odlišnými a den v týdnu je jednoznačný.

Prázdný sloupec ekvivalentu znamená, že druhý dialekt nemá pro něj jeden token a musíte hodnotu skládat sami. Testovací sada vykresluje pole kalendáře pomocí vlastních funkcí data platformy a porovnává je s touto tabulkou, takže příklady nemohou od reality odklonit.

Rok

4
strftimeLDMLPoleVykresluje se jako
%YyyyyČtyřciferný rok2026
%yyyDvouciferný rokAmbiguózní v konstrukci. Vyhnout se tomu v čemkoli uloženém.26
%CStoletí — rok dělený 10020
%GYYYYRok číslování ISO týdnůLiší se od kalendářního roku kolem Nového roku. Použijte pouze s číslem ISO týdne.2026

Měsíc

4

V LDML je MM měsíc a mm minuta.

strftimeLDMLPoleVykresluje se jako
%mMMMěsíc, doplněný nulami03
%-mMMěsíc, bez odsazení3
%bMMMZkrácený název měsíceMar
%BMMMMÚplný název měsíceMarch

Den a den v týdnu

8

V LDML je dd den měsíce a DDD je den roku.

strftimeLDMLPoleVykresluje se jako
%dddDen měsíce, doplněný nulami09
%-ddDen měsíce, bez odsazení9
%eDen měsíce, mezerou odsazen 9
%jDDDDen roku, 001–366068
%aEEEZkrácený název dne v týdnuMon
%AEEEEÚplný název dne v týdnuMonday
%uDen v týdnu jako číslo, pondělí je 1%w čísluje stejné dny od neděle jako 0.1
%VwwČíslo týdne ISO, týdny začínající pondělím11

Čas

8
strftimeLDMLPoleVykresluje se jako
%HHHHodina na 24hodinových hodinách14
%-HHHodina bez odsazení14
%IhhHodina na 12hodinových hodinách02
%MmmMinuta05
%SssVteřina07
%3NSSSMilisekundy000
%paDOP nebo odp.PM
%sZnačka Unix — sekund od 1970-01-01 UTC1773065107

Časové pásmo

3

Offset je číslo; název zóny je pravidlo. Pouze název přežívá změnu DST.

strftimeLDMLPoleVykresluje se jako
%zZZUTC offset, bez dvojtečky+0000
%:zXXXUTC offset s dvojtečkou, jak chce ISO 8601+00:00
%ZzzzZkratka časového pásmaZkratky nejsou jedinečné — CST je alespoň tři různé zóny.UTC

Běžné kombinace

7

Postaveno z výše uvedených tokenů — žádná knihovna není potřebná.

strftimeLDMLPoleVykresluje se jako
%Fyyyy-MM-ddDatum ISO2026-03-09
%THH:mm:ss24hodinový čas14:05:07
%FT%T%:zyyyy-MM-dd'T'HH:mm:ssXXXÚplná značka ISO 8601Formát, který se má uložit. Třídí se jako text, jednoznačný o offsetu.2026-03-09T14:05:07+00:00
%a, %d %b %Y %T %zEEE, dd MMM yyyy HH:mm:ss ZZRFC 2822 — e-mailové záhlaví a starší HTTPMon, 09 Mar 2026 14:05:07 +0000
%m/%d/%YMM/dd/yyyyKonvence USA, měsíc nejprve03/09/2026
%d.%m.%Ydd.MM.yyyyEvropská konvence, den nejprve09.03.2026
%%''Doslova znaménko procenta%

Časté dotazy

Jaký je rozdíl mezi yyyy a YYYY?
V LDML je yyyy kalendářní rok a YYYY je rok číslování ISO týdnů. Liší se na několik dní v každém lednu: 2027-01-01 padá do ISO týdne 53 roku 2026, takže YYYY tam čte 2026. Použití YYYY omylem produkuje chybu, která se objeví jednou za rok a pak zmizí, což je důvod, proč je tak těžké ji chytit.
Proč se můj měsíc zobrazuje jako minuty?
Protože jste v dialektu LDML a použili jste mm místo MM. LDML rozlišuje velikost písmen: M je měsíc, m je minuta, D je den roku, d je den v měsíci. strftime má stejnou fallen na jiném místě — %M jsou minuty a %m je měsíc.
Jak získám odsazené versus nepolštěné číslo?
V strftime rozšíření GNU %-d odstraní odsazení, takže %d je 09 a %-d je 9. V LDML počet písmen nastavuje šířku přímo: d je 9 a dd je 09. Ani jeden není přenosný — %-d neexistuje na všech platformách.
Kterém formátu bych měl uložit data?
ISO 8601 s explicitním offsetem — 2026-03-09T14:05:07+00:00. Třídí se správně jako text, je jednoznačný o offsetu a každý jazyk jej analyzuje. Uložte to a zformátujte pro zobrazení v poslední možné chvíli; uložené místní datum bez offsetu je neobnovitelná ztráta informací.