ISO 8601, ovvero come scrivere una data senza ambiguità
· 5 min di lettura
ISO 8601 esiste perché 03/04/2026 è marzo in America e aprile ovunque altrove. Scrivere 2026-04-03 elimina l’ambiguità, si ordina correttamente come testo ed è ciò che ogni interfaccia dovrebbe accettare.
03/04/2026 è il 3 aprile in quasi tutto il mondo e il 4 marzo negli Stati Uniti. Dalla sola stringa non c’è modo di capire quale fosse inteso, e le due letture sono entrambe del tutto ragionevoli. Ogni anno questa ambiguità produce scadenze mancate, doppie prenotazioni e almeno un guasto memorabile.
ISO 8601 è la norma internazionale che la elimina.
Il formato di base
2026-04-03T14:30:00Z
Leggendo da sinistra a destra, dall’unità più grande alla più piccola:
2026-04-03— anno, mese, giorno, ciascuno con lo zero iniziale, sempre in quest’ordineT— il separatore fra data e ora, obbligatorio nella forma rigorosa14:30:00— ore, minuti, secondi su un orologio a 24 oreZ— l’indicatore di fuso.Zsignifica esattamente UTC
Il punto è l’ordine. Poiché le componenti vanno dalla più significativa alla meno significativa, una stringa ISO 8601 si ordina correttamente come testo semplice. 2026-04-03 precede 2026-04-10 in un semplice confronto di stringhe, cosa che nessun altro formato comune riesce a fare. Già solo questa proprietà giustifica la norma.
Indicatori di fuso
Tre forme sono valide, e significano cose diverse:
| Forma | Significato |
|---|---|
2026-04-03T14:30:00Z |
14:30 UTC. Non ambigua |
2026-04-03T14:30:00+05:45 |
14:30 ora locale in un fuso avanti di 5 h 45 min su UTC. Non ambigua |
2026-04-03T14:30:00 |
14:30 in un fuso non indicato. Non è una marca temporale |
La terza forma è quella che crea guai. È una data-ora locale: una lettura d’orologio senza alcun modo di collocarla su una linea del tempo. Passarla attraverso un confine di sistema sperando che l’altra parte assuma il vostro stesso fuso è un difetto che aspetta un rilascio in un’altra regione.
Notate anche che cosa non è uno scarto: +05:45 vi dice lo scarto del Nepal, non che la marca temporale venga dal Nepal. Gli scarti non sono fusi — lo stesso scarto è condiviso da più fusi, e lo scarto di un fuso cambia. Portate a fianco l’identificativo se dovete sapere dove.
RFC 3339, il profilo che probabilmente volete
ISO 8601 è ampia. Permette date settimanali (2026-W14-5), date ordinali (2026-093), unità frazionarie e una forma troncata che omette il secolo. Quasi nulla di tutto ciò è ciò che volete in un’interfaccia.
RFC 3339 è un profilo stretto per i protocolli di internet. Richiede la data completa, richiede un indicatore di fuso e ammette come separatore o T o uno spazio. Quando qualcuno dice «formato ISO» parlando di un’API, intende quasi sempre RFC 3339.
Una regola utile: accettate tutto ciò che un buon analizzatore digerisce; emettete solo RFC 3339 rigoroso con Z.
Durate e intervalli
Meno usati, e vale la pena conoscerli quando si incontrano.
Le durate cominciano con P di periodo, e T separa la parte data dalla parte ora:
P3Y6M4D— tre anni, sei mesi, quattro giorniPT1H30M— un’ora e trenta minutiP1DT12H— un giorno e dodici ore
La T non è facoltativa: P1M è un mese, PT1M è un minuto. È il classico difetto delle durate ISO 8601.
Gli intervalli uniscono due punti con una barra: 2026-04-03T14:00Z/2026-04-03T16:00Z, oppure un punto e una durata: 2026-04-03T14:00Z/PT2H.
I dati strutturati HowTo di questo sito usano la sintassi delle durate — PT2M per un’attività di due minuti — perché schema.org prescrive durate ISO 8601.
Le date settimanali e la trappola che nascondono
2026-W14-5 è il venerdì della quattordicesima settimana ISO del 2026. Le settimane ISO cominciano di lunedì, e la settimana 1 è quella che contiene il primo giovedì di gennaio.
La conseguenza su cui si inciampa: l’anno settimanale ISO non è sempre l’anno solare. Il 1º gennaio 2027 cade nella settimana ISO 53 del 2026. Il codice di formattazione che accoppia un numero di settimana ISO con un anno solare produce una data sbagliata per qualche giorno ogni anno, e nella maggior parte dei linguaggi gli identificatori di formato si somigliano quasi del tutto (YYYY contro GGGG, o %Y contro %G).
Regole pratiche
- Salvate in UTC, emettete con
Z.2026-04-03T14:30:00Zha esattamente un significato ovunque. - Non emettete mai una data-ora locale nuda attraverso un confine. Se non potete allegare un fuso, non avete una marca temporale.
- Riempite tutto con lo zero.
2026-4-3non è ISO 8601 valido, anche se quasi tutti gli analizzatori lo accettano. - Usate i separatori
-e:. La forma compatta (20260403T143000Z) è lecita ma ostile, e alcuni analizzatori la rifiutano. - Tenete l’identificativo di fuso a parte quando dovete sapere dove, non solo quale scarto.
Europe/Londonsopravvive a un cambio di regole;+01:00no.
Insidie nell’analisi
Anche con una norma, è nell’analisi che le cose vanno storte.
Il costruttore Date di JavaScript è incoerente con input non ISO. new Date('2026-04-03') viene letto come mezzanotte UTC. new Date('2026-04-03T00:00:00') — senza indicatore di fuso — viene letto come mezzanotte locale. I due differiscono del vostro scarto, il che significa che lo stesso codice produce giorni diversi a seconda di dove gira. Mettete sempre un indicatore di fuso.
Gli anni a due cifre sono ambigui e andrebbero rifiutati. ISO 8601 ammette una forma troncata; quasi nulla dovrebbe accettarla. 26-04-03 potrebbe essere il 1926 o il 2026, e la finestra scorrevole che decide è una scelta di politica nascosta dentro un analizzatore.
I decimi di secondo variano in precisione. 14:30:00.5, 14:30:00.500 e 14:30:00.500000 sono tutti validi e tutti lo stesso istante. Un analizzatore che confronta stringhe anziché istanti non sarà d’accordo.
La virgola è lecita. ISO 8601 ammette 14:30:00,5 — virgola decimale — e anzi la preferisce. Quasi tutti gli analizzatori la rifiutano. Se consumate dati da un sistema europeo, tenetevi pronti.
La mezzanotte ha due scritture. 24:00:00 di un giorno è lo stesso istante di 00:00:00 del giorno dopo, ed entrambe sono ISO 8601 valido. Emettete la seconda forma; accettatele entrambe.
Una nota sull’ordinamento
L’ordinabilità di ISO 8601 vale solo per stringhe con la stessa rappresentazione di fuso. 2026-04-03T14:00:00Z e 2026-04-03T10:00:00-05:00 sono lo stesso istante, ma come stringhe la seconda si ordina prima.
Se ordinate marche temporali come testo — in un file di registro, in un nome di file, in una colonna di database tipizzata come testo — normalizzatele prima tutte a UTC con Z. Altrimenti l’ordine è una proprietà della formattazione e non del tempo.