# ISO 8601

L'ISO 8601 (Data elements and interchange formats - Information interchange - Representation of dates and times) è uno standard internazionale per la rappresentazione di date e orari.

## Storia

Questo standard fu pubblicato per la prima volta il 15 giugno 1988 per uniformare diversi vecchi standard ISO: ISO 2014, ISO 2015, ISO 2711, ISO 3307 e ISO 4031. Fu aggiornato il 21 dicembre 2000 e successivamente con la norma attuale ISO 8601:2004 pubblicata il 3 dicembre 2004.
La notazione numerica big-endian delle date fu introdotta dall'ISO 2014, l'ISO 2015 introduce il sistema di numerazione delle settimane, mentre nell'ISO 2711 i giorni venivano identificati da numeri ordinali.
La necessità di uno standard nasce dal fatto che la data formulata come 04-09-03 può indicare il:
* 4 settembre 2003 (o addirittura 1903) in Europa e altri Paesi,
* 9 aprile 2003 negli Stati Uniti d'America,
* 3 settembre 2004 secondo lo standard ISO 8601.
Come si può facilmente capire questa incertezza può creare molti problemi nei commerci e nelle comunicazioni internazionali.
La ISO 8601 è attualmente suddivisa in 8601-1 e 8601-2; l'edizione corrente è 2019.

## Principi generali

I valori delle date e degli orari sono organizzati da quello più significativo a quello meno. Ogni valore (di anni, mesi, minuti, e così via) deve avere un numero fisso di cifre che può essere raggiunto aggiungendo zeri; ad esempio il 3 settembre 2006 deve essere scritto 2006-09-03 e non 2006-9-3.
Sono possibili due tipi di rappresentazione: la forma base con il minor numero di caratteri, la forma estesa per una maggiore facilità di lettura da parte dell'utente umano. Ad esempio 2005-07-24 è in forma estesa, mentre in forma base è 20050724, questo è possibile senza ambiguità appunto perché ogni valore deve avere un numero fisso di cifre.
I parametri meno significativi possono essere omessi, in questo modo 2004-05 indica "maggio 2004". Infine, lo standard permette di usare valori decimali nei secondi quando è richiesta un'alta precisione.

## Date

L'ISO 8601 usa il calendario gregoriano, che è de facto uno standard nei commerci internazionali.
Il calendario gregoriano viene usato anche per le date precedenti il 15 ottobre 1582 (1582-10-15), data di introduzione da parte di papa Gregorio XIII di questo calendario. Il giorno precedente, 4 ottobre 1582 secondo il calendario giuliano, viene quindi indicato come 1582-10-14. Si tratta quindi di un calendario gregoriano prolettico.

### Anni

Lo standard prevede l'uso di quattro cifre per evitare il millennium bug, ovvero una ambiguità nell'indicazione dell'anno. Gli anni avanti Cristo (a.C.) devono obbligatoriamente essere preceduti da un segno -, a parte per l'anno 1 a.C., come spiegato di seguito. Per quelli dopo Cristo (d.C.) è possibile, ma non obbligatorio, mettere un segno +.
Per gli anni avanti Cristo la norma ISO adotta la notazione degli astronomi che prevede l'anno zero, assente nella notazione degli storici; l'anno 1 a.C. viene indicato con 0000, l'anno 2 a.C. con -0001 e così via; ad esempio, la data 1º marzo 1 a.C. si scrive 0000-03-01; la data 1º marzo 2 a.C. si scrive -0001-03-01.
La versione ISO 8601:2000 dava la possibilità di scrivere l'anno con solo due cifre, ma questa forma è stata soppressa nella versione 2004 in cui si devono usare sempre almeno quattro cifre.

### Settimane

Un altro modo per indicare la data previsto dall'ISO 8601 è attraverso la settimana. Il formato inizia con l'anno [YYYY], poi la lettera "W" in maiuscolo seguita dal numero della settimana [WW] da 01 a 53; alcuni anni finiscono alla settimana 52. Può essere indicato anche il giorno della settimana [D] con una cifra da 1 per lunedì a 7 per la domenica. Questa forma è molto usata all'interno delle aziende.
La settimana 01 dell'anno è definita come (sono tutte equivalenti):
* la settimana che contiene il primo giovedì dell'anno,
* la settimana che contiene il 4 gennaio,
* la prima settimana che contiene quattro, o più, giorni del nuovo anno,
* la settimana che inizia con il lunedì fra il 29 dicembre e il 4 gennaio,
* se il 1º gennaio è un lunedì, martedì, mercoledì o giovedì allora è nella settimana 01. Se capita di venerdì, sabato o domenica allora è nell'ultima settimana (la 52 o 53) dell'anno precedente.
Il numero della settimana può essere calcolato contando i giovedì: la settimana 12 contiene il dodicesimo giovedì dell'anno.

#### Formule per fogli elettronici

Quelle che seguono sono formule per fogli elettronici per calcolare l'anno ISO e la settimana ISO di un giorno (testate su Microsoft Excel versione 2308 italiano e LibreOffice Calc 7.5.3.2 italiano). Sia A1 la cella che contiene la data da considerare.
L'anno ISO è espresso dalla formula seguente:
* ANNO(A1 - GIORNO.SETTIMANA(A1;2) + 4)
(anno gregoriano del giovedì della stessa settimana di A1)
Per quanto riguarda la settimana ISO, Microsoft Excel e LibreOffice Calc hanno introdotto una funzione specifica:
* NUM.SETTIMANA.ISO(A1)
Altrimenti, è possibile utilizzare la formula seguente:
* (A1 - GIORNO.SETTIMANA(A1;2) - DATA(ANNO(A1 - GIORNO.SETTIMANA(A1;2) + 4);1;4) + GIORNO.SETTIMANA(DATA(ANNO(A1 - GIORNO.SETTIMANA(A1;2) + 4);1;4);2)) / 7 + 1
(distanza in settimane tra il primo giovedì dell'anno ISO e il giovedì della stessa settimana di A1).
Per visualizzare correttamente la settimana occorre selezionare Generale o Numero come Categoria in Formato celle.

### Data completa

La data completa è la forma più familiare per la maggior parte delle persone. Come detto sopra [YYYY] indica l'anno in modo univoco. [MM] indica il mese in cifre, da 01 a 12. [DD] indica il giorno del mese, da 01 a 31. Ad esempio il "5 aprile 1981" può essere scritto come 1981-04-05 in forma estesa o 19810405 in forma base.
Lo standard permette anche di usare minor precisione. Ad esempio si può scrivere "1981-04" per riferirsi al mese "aprile 1981"; oppure semplicemente "1981" per indicare l'anno.
L'anno ISO inizia il lunedì della settimana 01 e termina la domenica prima dell'inizio del nuovo anno ISO. Contiene 52 o 53 settimane complete. Il numero dell'anno ISO è differente da quello dell'anno gregoriano al massimo nei primi venerdì, sabato e domenica del nuovo anno; e gli ultimi lunedì, martedì e mercoledì del vecchio anno. Il giovedì, l'anno ISO è sempre uguale all'anno gregoriano. Esempi:
* 2008-12-29 è il "2009-W01-1",
* 2010-01-03 è il "2009-W53-7".

### Date ordinali

Le date ordinali sono una forma semplice per rappresentare un giorno specifico senza indicare il numero della settimana o del mese. Questa rappresentazione prevede l'anno [YYYY] e il numero del giorno [DDD] da 001 a 365 o 366 negli anni bisestili. Ad esempio "1981-095" sta per "1981-04-05" (5 aprile 1981).
Questo sistema è frequentemente, ma non in modo corretto, riferito al giorno giuliano.

### Sviluppi futuri

Lo standard prevede che, previo accordo fra le parti in comunicazione, possono essere usate più di quattro cifre per indicare l'anno. Serve per rappresentare anni prima del 10001 a.C. o dopo il 10000. Tuttavia si possono creare ambiguità se si usa la forma base, senza separatori. Ad esempio "200406" può indicare l'anno 200406 o "giugno 2004". L'ISO suggerisce di usare una forma di comunicazione esplicita per evitare tali confusioni, dato anche il numero minimo di casi che si vengono a creare.

## Orari

L'ISO 8601 usa il sistema a 24 ore come la maggior parte del mondo. La forma base è [hh][mm][ss], mentre la forma estesa è [hh]:[mm]:[ss]. [hh] indica l'ora tra le 00 e le 23, [mm] si riferisce ai minuti da 00 a 59, e [ss] i secondi sempre tra 00 e 59. Esistono due eccezioni: la mezzanotte può essere indicata con la forma 24:00:00, e i secondi possono arrivare a 60 nel caso del minuto di 61 secondi.
Se non sono necessari possono essere omessi i valori meno significativi, ovvero usare le forme [hh]:[mm] oppure [hh].
Si possono indicare anche valori decimali usando la virgola (l'uso del punto è ammesso ma sconsigliato), ad esempio 03:14:30 si può scrivere 03:14,5 oppure, in forma base, 0314,5.
La mezzanotte è un caso speciale, lo stesso istante può essere indicato in due modi diversi; le scritte "1981-04-05T24:00" e "1981-04-06T00:00" sono equivalenti. La notazione "00:00" è usata all'inizio del giorno, mentre "24:00" alla fine dello stesso.

### Fuso orario

Se non ci sono indicazioni riguardo al fuso orario si assume che sia quello locale. Questo non crea problemi se la comunicazione avviene fra due persone della stessa zona, ma può creare ambiguità nelle transazioni internazionali; per questo si consiglia di indicare il fuso orario con la notazione standard.

#### UTC

Se l'orario è quello relativo a una zona appartenente al fuso orario UTC basta aggiungere una "Z" dopo le cifre, senza spazi. Ad esempio "14:45:15 UTC" può essere scritto come "14:45:15Z" oppure "144515Z".

#### Altre zone

Le altre zone sono espresse indicando la differenza rispetto a UTC nella forma ±[hh]:[mm], ±[hh][mm] o ±[hh]. Ad esempio l'ora solare (invernale) italiana è indicata come "+01:00", "+0100" o semplicemente "+01", mentre quella legale con "+02:00", "+0200" oppure "+02". Quando si scrive un orario si deve indicare solo l'attuale differenza rispetto l'UTC, quindi varia nel corso dell'anno.
Questi orari indicano tutti lo stesso istante: "18:30Z", "22:30+04", "1130-0700" e "15:00-03:30".

## Rappresentazioni combinate

Per rappresentare assieme data e orario, basta inserire una "T" fra la data e l'ora indicate con le proprie regole. Di solito si usa la forma [YYYY]-[MM]-[DD]T[hh]:[mm]:[ss]±[hh]:[mm], come ad esempio "1981-04-05T14:30:30-05:00" (in forma base "19810405T143030-0500").
A volte data e ora vengono rappresentati non divisi dalla "T", ma da uno spazio: questo non rispetta lo standard ISO 8601, ma viene fatto per permettere una più facile lettura umana; tecnicamente però non è una rappresentazione combinata, ma solo due rappresentazioni semplici poste vicino, come descritto dalla RFC 3339.

## Durate

Periodi e durate sono rappresentate nel formato P[n]Y[n]M[n]DT[n]H[n]M[n]S (o P[n]Y[n]W[n]DT[n]H[n]M[n]S se si usano le settimane), dove [n] è un numero appropriato per l'elemento che segue; le lettere maiuscole devono essere riportare così come sono. Se il valore di un elemento è zero questo può essere omesso, ma inserirlo può facilitare la comprensione. Da notare che "P1M" rappresenta un mese, mentre "PT1M" un minuto. Ad esempio "P3Y6M4DT12H30M0S" indica un periodo di tre anni, sei mesi, quattro giorni, dodici ore, trenta minuti e zero secondi. Anche in questo caso possono essere usati valori decimali, infatti "P0,5Y" indica metà anno. Alternativamente può essere usata la forma P[YYYY]-[MM]-[DD]T[hh]:[mm]:[ss]; e l'esempio sopra diventa "P0003-06-04T12:30:00".

### Intervallo di tempo

Un intervallo di tempo può essere rappresentato in quattro modi:
* inizio e fine: "2002-03-01T13:00:00Z/2003-05-11T15:30:00Z",
* inizio e durata: "2002-03-01T13:00:00Z/P1Y2M10DT2H30M",
* durata e fine: "P1Y2M10DT2H30M/2003-05-11T15:30:00Z",
* solo la durata: "P1Y2M10DT2H30M".
Di queste forme, le prime tre richiedono due parti i cui valori sono separati dalla barra "/" (è ammesso anche il doppio tratto "—", sebbene l'uso sia sconsigliato). Se nella seconda parte mancano alcuni valori, questi sono considerati uguali a quelli della prima parte.

### Intervalli ripetuti

Per ripetere un intervallo si inserisce "R[n]/" prima dell'espressione dell'intervallo, dove [n] rappresenta il numero di ripetizioni. Ad esempio per ripetere l'intervallo "P1Y2M10DT2H30M" cinque volte partendo da "2002-03-01T13:00:00Z", si scrive "R5/2002-03-01T13:00:00Z/P1Y2M10DT2H30M".

## Uso

In Internet, l'ISO 8601 è usato dal W3C per definire uno standard che limita la possibilità di errore e riduce la complessità del software.
La RFC 3339 definisce un profilo dell'ISO 8601 che può essere usato nella suite di protocolli Internet. Esclude esplicitamente l'uso di durate e date avanti Cristo. Usa la notazione [hh]:[mm]:[ss]-00:00 per indicare il fuso orario locale se sconosciuto. I formati più complessi come quelli che usano le settimane o le date ordinali sono scoraggiati.
L'ISO 8601 è richiamato in molte altre specifiche tecniche, ma non sempre sono ammesse tutte le varianti che lo standard prevede.

## Varianti

Alcune volte si possono trovare nell'uso comune delle varianti a questo standard.
Ad esempio usare lo zero per indicare la domenica, nei Paesi in cui, per consuetudine, la settimana inizia con questo giorno.
Oppure inserire una lettera da "A" a "G" dopo la data per indicare il giorno della settimana, ad esempio scrivere "2001-001A" che significa "Lunedì, 1º gennaio 2001". Questa lettera sostituisce la "T" nelle rappresentazioni combinate di data e orario.
Altra variante, usando le settimane, è di dividere il mese in quattro o cinque settimane, anziché l'intero anno. Anche questa forma, come quella ufficiale, può essere seguita da una cifra che indica il giorno della settimana, da 1 per lunedì a 7 per la domenica.
Alcuni dividono l'anno in trimestri, ciascuno formato da tre mesi interi, che vengono indicati con "Qq", dove la maiuscola rimane tale, la minuscola viene sostituita da una cifra da 1 a 4. Questo riferimento può essere usato in uno qualsiasi dei formati per le date precedentemente visti.