Przejdź do treści

Tokeny formatu daty

Istnieją dwie szeroko używane rodziny łańcuchów formatu daty i nakładają się na tyle, aby być niebezpieczne. strftime — z C i odziedziczone przez Python, Ruby, PHP i GNU date — używa tokenów procentowych jak %Y. Unicode LDML, używany przez ICU, Java, moment i dayjs, używa powtórzonych liter jak yyyy. W LDML MM to miesiąc a mm to minuta; przywrócenie tej pary wstecz to klasyczny błąd.

Każdy wiersz poniżej jest renderowany dla tej samej chwili: poniedziałek 9 marca 2026, 14:05:07 UTC. Ta data jest wybrana, aby nic nie się ukrywało — pojedynczy-cyfrowy dzień i miesiąc ujawniają dopełnienie zerami, godzina popołudia sprawia, że zegary 12- i 24-godzinne różnią się widocznie, a dzień tygodnia jest jednoznaczny.

Pusta kolumna równoważna oznacza, że inny dialekt nie ma jednego tokena dla niego i musisz skomponować wartość samemu. Zestaw testów renderuje pola kalendarza za pomocą funkcji daty samej platformy i porównuje je z tą tabelą, więc przykłady nie mogą dryfować od rzeczywistości.

Rok

4
strftimeLDMLPoleRenders as
%YyyyyCzterocyfrowy rok2026
%yyyDwucyfrowy rokNiejednoznaczny przez konstrukcję. Unikaj go w czymkolwiek przechowanym.26
%CWiek — rok podzielony przez 10020
%GYYYYRok numerowania tygodnia ISORóżni się od roku kalendarzowego wokół Nowego Roku. Używaj tylko z numerem tygodnia ISO.2026

Miesiąc

4

W LDML MM to miesiąc i mm to minuta.

strftimeLDMLPoleRenders as
%mMMMiesiąc, dopełniony zerami03
%-mMMiesiąc, bez dopełnienia3
%bMMMSkrócona nazwa miesiącaMar
%BMMMMPełna nazwa miesiącaMarch

Dzień i dzień tygodnia

8

W LDML dd to dzień miesiąca i DDD to dzień roku.

strftimeLDMLPoleRenders as
%dddDzień miesiąca, dopełniony zerami09
%-ddDzień miesiąca, bez dopełnienia9
%eDzień miesiąca, dopełniony spacją 9
%jDDDDzień roku, 001–366068
%aEEESkrócona nazwa dnia tygodniaMon
%AEEEEPełna nazwa dnia tygodniaMonday
%uDzień tygodnia jako liczba, poniedziałek to 1%w numeruje te same dni od niedzieli jako 0.1
%VwwNumer tygodnia ISO, tygodnie zaczynające się poniedziałek11

Czas

8
strftimeLDMLPoleRenders as
%HHHGodzina na zegarze 24-godzinnym14
%-HHGodzina, bez dopełnienia14
%IhhGodzina na zegarze 12-godzinnym02
%MmmMinuta05
%SssSekunda07
%3NSSSMilisekundy000
%paAM lub PMPM
%sUniksowa sygnatura czasowa — sekundy od 1970-01-01 UTC1773065107

Strefa czasowa

3

Offset to liczba; nazwa strefy to reguła. Tylko nazwa przetrwa zmianę DST.

strftimeLDMLPoleRenders as
%zZZOffset UTC, bez dwukropka+0000
%:zXXXOffset UTC z dwukropkiem, jak chce ISO 8601+00:00
%ZzzzSkrót strefy czasowejSkróty nie są unikalne — CST jest co najmniej trzema różnymi strefami.UTC

Typowe kombinacje

7

Zbudowany z tokenów powyżej — nie potrzebna żadna biblioteka.

strftimeLDMLPoleRenders as
%Fyyyy-MM-ddData ISO2026-03-09
%THH:mm:ss24-godzinny czas14:05:07
%FT%T%:zyyyy-MM-dd'T'HH:mm:ssXXXPełna sygnatura czasowa ISO 8601Format do przechowywania. Sortuje się jako tekst, jednoznaczny o offsetie.2026-03-09T14:05:07+00:00
%a, %d %b %Y %T %zEEE, dd MMM yyyy HH:mm:ss ZZRFC 2822 — nagłówki e-mail i starszy HTTPMon, 09 Mar 2026 14:05:07 +0000
%m/%d/%YMM/dd/yyyyKonwencja USA, miesiąc najpierw03/09/2026
%d.%m.%Ydd.MM.yyyyKonwencja europejska, dzień najpierw09.03.2026
%%''Dosłowny znak procent%

Częste pytania

Jaka jest różnica między yyyy i YYYY?
W LDML yyyy to rok kalendarzowy, a YYYY to rok numerowania tygodnia ISO. Różnią się przez kilka dni każdego stycznia: 2027-01-01 przypada w tygodniu ISO 53 z 2026, więc YYYY czyta 2026 tam. Użycie YYYY przez przypadek produkuje błąd, który pojawia się raz w roku, a następnie znika, dlatego tak trudno go złapać.
Dlaczego mój miesiąc pojawia się jako minuty?
Ponieważ jesteś w dialekcie LDML i używałeś mm zamiast MM. LDML jest wrażliwy na wielkość liter: M to miesiąc, m to minuta, D to dzień roku, d to dzień miesiąca. strftime ma tę samą pułapkę w innym miejscu — %M to minuty a %m to miesiąc.
Jak uzyskać numerowane dopełnione versus niedopełnione?
W strftime rozszerzenie GNU %-d usuwa dopełnienie, więc %d to 09 a %-d to 9. W LDML liczba liter ustawia szerokość bezpośrednio: d to 9 a dd to 09. Żaden nie jest przenośny — %-d nie istnieje na każdej platformie.
Który format powinienem przechowywać daty?
ISO 8601 z wyraźnym offsetem — 2026-03-09T14:05:07+00:00. Sortuje się poprawnie jako tekst, jest jednoznaczny o offsetie, i każdy język go analizuje. Przechowuj to i formatuj do wyświetlenia w ostatniej możliwej chwili; przechowywana data lokalna bez offsetu to bezpowrotna strata informacji.