Sări la conținut

Jetoane de format dată

Există două familii larg folosite de șiruri de format dată și se suprapun doar suficient pentru a fi periculoase. strftime — din C, și moștenit de Python, Ruby, PHP și GNU date — folosește jetoane procentuale cum ar fi %Y. Unicode LDML, folosit de ICU, Java, moment și dayjs, folosește litere repetate cum ar fi yyyy. În LDML, MM este o lună și mm este un minut; greșirea aceia pereche este bug-ul clasic.

Fiecare rând de mai jos este randat pentru același instant: Luni 9 martie 2026, 14:05:07 UTC. Acea dată este aleasă deci nimic nu se ascunde — o zi și o lună cu o singură cifră expun umplere cu zero, ora după-amiazei face diferența ceasurilor de 12 și 24 de ore vizibilă, și ziua săptămânii este lipsită de ambiguitate.

O coloană echivalentă goală înseamnă că cealaltă dialectă nu are un singur jeaton pentru ea și trebuie să compui valoarea singur. Suitele de teste randează câmpurile calendarului cu funcțiile de dată ale platformei și le compară cu acest tabel, deci exemplele nu pot derivă din realitate.

An

4
strftimeLDMLCâmpRandează ca
%YyyyyAn din patru cifre2026
%yyyAn din două cifreAmbiguu prin construcție. Evită-l în orice depozitate.26
%CSecol — anul împărțit la 10020
%GYYYYAn de numerotare săptămână ISODiferit de anul calendaristic în jur de New Year. Folosești cu numărul săptămânii ISO numai.2026

Lună

4

În LDML, MM este luna și mm este minutul.

strftimeLDMLCâmpRandează ca
%mMMLună, zero-umplută03
%-mMLună, nicio umplere3
%bMMMNume de lună abreviatMar
%BMMMMNume de lună completMarch

Zi și zi a săptămânii

8

În LDML, dd este ziua din lună și DDD este ziua din an.

strftimeLDMLCâmpRandează ca
%dddZiua din lună, zero-umplută09
%-ddZiua din lună, nicio umplere9
%eZiua din lună, spațiu-umplută 9
%jDDDZiua din an, 001–366068
%aEEENume de ziua săptămânii abreviatMon
%AEEEENume de ziua săptămânii completMonday
%uZiua săptămânii ca număr, luni este 1%w numerotează aceleași zile din duminică ca 0.1
%VwwNumărul săptămânii ISO, săptămânile care încep luni11

Timp

8
strftimeLDMLCâmpRandează ca
%HHHOră pe ceasul de 24 de ore14
%-HHOră, nicio umplere14
%IhhOră pe ceasul de 12 ore02
%MmmMinut05
%SssSecund07
%3NSSSMilisecunde000
%paAM sau PMPM
%sMarca de timp Unix — secunde din 1970-01-01 UTC1773065107

Fus orar

3

Un offset este un număr; un nume de zonă este o regulă. Doar numele supraviețuiește unei schimbări DST.

strftimeLDMLCâmpRandează ca
%zZZOffset UTC, niciun două puncte+0000
%:zXXXOffset UTC cu o colon, cum dorește ISO 8601+00:00
%ZzzzAbreviatura fusului orarAbrevierile nu sunt unice — CST este cel puțin trei zone diferite.UTC

Combinații comune

7

Construit din jetoanele de mai sus — nicio bibliotecă necesară.

strftimeLDMLCâmpRandează ca
%Fyyyy-MM-ddDată ISO2026-03-09
%THH:mm:ssTimp de 24 de ore14:05:07
%FT%T%:zyyyy-MM-dd'T'HH:mm:ssXXXMarca de timp ISO 8601 completăFormatul de depozitate. Sortează ca text, fără ambiguitate în privința offset.2026-03-09T14:05:07+00:00
%a, %d %b %Y %T %zEEE, dd MMM yyyy HH:mm:ss ZZRFC 2822 — anteturi de email și HTTP mai vechiMon, 09 Mar 2026 14:05:07 +0000
%m/%d/%YMM/dd/yyyyConvenție SUA, lună în primul rând03/09/2026
%d.%m.%Ydd.MM.yyyyConvenție europeană, zi în primul rând09.03.2026
%%''Un semn procent literal%

FAQ

Care este diferența dintre yyyy și YYYY?
În LDML, yyyy este anul calendaristic și YYYY este anul numerotării săptămânii ISO. Acestea diferă pentru câteva zile fiecare ianuarie: 2027-01-01 cade în săptămâna ISO 53 din 2026, deci YYYY citește 2026 acolo. Utilizarea YYYY din accident produce un bug care apare o dată pe an și apoi dispare, de aceea este atât de greu de prins.
De ce lunii meu apare ca minute?
Deoarece ești într-o dialectă LDML și ai folosit mm în loc de MM. LDML este sensibil la caz: M este lună, m este minut, D este ziua anului, d este ziua din lună. strftime are aceeași capcană într-un loc diferit — %M este minute și %m este luna.
Cum obțin un număr umplutat versus neumplutat?
În strftime, extensiunea GNU %-d elimină umplerea, deci %d este 09 și %-d este 9. În LDML numărul de litere stabilește lățimea direct: d este 9 și dd este 09. Niciunul nu este portabil — %-d nu există pe fiecare platformă.
Ce format ar trebui să stochez datele?
ISO 8601 cu un offset explicit — 2026-03-09T14:05:07+00:00. Se sortează corect ca text, este lipsit de ambiguitate cu privire la offset, și fiecare limbă îl analizează. Stochează asta și formează pentru afișare în ultimul moment posibil; o dată locală stocată fără un offset este pierdere de informații nerecuperabilă.