Vai al contenuto

Token di formato della data

Ci sono due famiglie ampiamente utilizzate di stringhe di formato data e si sovrappongono abbastanza da essere pericolose. strftime — da C, ed ereditato da Python, Ruby, PHP e GNU date — usa token percentuale come %Y. Unicode LDML, utilizzato da ICU, Java, moment e dayjs, usa lettere ripetute come yyyy. In LDML, MM è un mese e mm è un minuto; ottenere quella coppia al contrario è il bug classico.

Ogni riga sottostante è resa per lo stesso istante: lunedì 9 marzo 2026, 14:05:07 UTC. Quella data è scelta in modo che nulla si nasconda — un giorno e un mese a una sola cifra espongono il padding con zeri, l'ora pomeridiana fa differire visibilmente gli orologi 12 e 24 ore, e il giorno della settimana è inequivocabile.

Una colonna equivalente vuota significa che l'altro dialetto non ha un singolo token per esso e devi comporre il valore tu stesso. La suite di test renderizza i campi del calendario con le funzioni di data della piattaforma stessa e li confronta con questa tabella, quindi gli esempi non possono allontanarsi dalla realtà.

Anno

4
strftimeLDMLCampoRenderizza come
%YyyyyAnno a quattro cifre2026
%yyyAnno a due cifreAmbiguo per costruzione. Evitalo in qualsiasi cosa memorizzata.26
%CSecolo — l'anno diviso per 10020
%GYYYYAnno di numerazione della settimana ISODifferisce dall'anno civile intorno a Capodanno. Usa solo con il numero della settimana ISO.2026

Mese

4

In LDML, MM è il mese e mm è il minuto.

strftimeLDMLCampoRenderizza come
%mMMMese, zero-padded03
%-mMMese, nessun riempimento3
%bMMMNome del mese abbreviatoMar
%BMMMMNome completo del meseMarch

Giorno e giorno della settimana

8

In LDML, dd è giorno del mese e DDD è giorno dell'anno.

strftimeLDMLCampoRenderizza come
%dddGiorno del mese, zero-padded09
%-ddGiorno del mese, nessun riempimento9
%eGiorno del mese, riempito con spazi 9
%jDDDGiorno dell'anno, 001–366068
%aEEENome del giorno della settimana abbreviatoMon
%AEEEENome del giorno della settimana completoMonday
%uGiorno della settimana come numero, lunedì è 1%w numera gli stessi giorni da domenica come 0.1
%VwwNumero della settimana ISO, settimane che iniziano lunedì11

Tempo

8
strftimeLDMLCampoRenderizza come
%HHHOra sull'orologio 24 ore14
%-HHOra, nessun riempimento14
%IhhOra sull'orologio 12 ore02
%MmmMinuto05
%SssSecondo07
%3NSSSMillisecondi000
%paAM o PMPM
%sTimestamp Unix — secondi dal 1970-01-01 UTC1773065107

Zona del tempo

3

Un offset è un numero; un nome di zona è una regola. Solo il nome sopravvive a un cambiamento dell'ora legale.

strftimeLDMLCampoRenderizza come
%zZZOffset UTC, nessun due punti+0000
%:zXXXOffset UTC con un due punti, come vuole ISO 8601+00:00
%ZzzzAbbreviazione della zona del tempoLe abbreviazioni non sono uniche — CST è almeno tre zone diverse.UTC

Combinazioni comuni

7

Costruito dai token sopra — nessuna libreria necessaria.

strftimeLDMLCampoRenderizza come
%Fyyyy-MM-ddData ISO2026-03-09
%THH:mm:ssOra 24 ore14:05:07
%FT%T%:zyyyy-MM-dd'T'HH:mm:ssXXXTimestamp ISO 8601 completoIl formato da memorizzare. Si ordina come testo, inequivocabile sull'offset.2026-03-09T14:05:07+00:00
%a, %d %b %Y %T %zEEE, dd MMM yyyy HH:mm:ss ZZRFC 2822 — intestazioni di posta e HTTP più vecchiMon, 09 Mar 2026 14:05:07 +0000
%m/%d/%YMM/dd/yyyyConvenzione statunitense, mese prima03/09/2026
%d.%m.%Ydd.MM.yyyyConvenzione europea, giorno prima09.03.2026
%%''Un segno di percentuale letterale%

FAQ

Qual è la differenza tra yyyy e YYYY?
In LDML, yyyy è l'anno civile e YYYY è l'anno di numerazione della settimana ISO. Differiscono per alcuni giorni ogni gennaio: 2027-01-01 rientra nella settimana ISO 53 del 2026, quindi YYYY legge 2026 lì. L'uso accidentale di YYYY produce un bug che appare una volta all'anno e poi scompare, ed è per questo che è così difficile da catturare.
Perché il mio mese viene visualizzato come minuti?
Perché sei in un dialetto LDML e hai usato mm invece di MM. LDML è sensibile alle maiuscole: M è mese, m è minuto, D è giorno dell'anno, d è giorno del mese. strftime ha la stessa trappola in un posto diverso — %M è minuti e %m è il mese.
Come ottengo un numero riempito rispetto a uno non riempito?
In strftime, l'estensione GNU %-d elimina il riempimento, quindi %d è 09 e %-d è 9. In LDML il conteggio delle lettere imposta direttamente la larghezza: d è 9 e dd è 09. Nessuno dei due è portabile — %-d non esiste su ogni piattaforma.
In quale formato dovrei archiviare le date?
ISO 8601 con un offset esplicito — 2026-03-09T14:05:07+00:00. Si ordina correttamente come testo, è inequivocabile sull'offset, e ogni lingua lo analizza. Memorizza quello e formatta per la visualizzazione nell'ultimo momento possibile; una data locale memorizzata senza un offset è una perdita di informazioni irrecuperabile.