In questo documento si propone uno standard per l'inserimento di una data generica utilizzando un qualunque calendario. Lo standard proposto risponde ai seguenti requisiti:
Nei seguenti paragrafi viene descritto il BNF utilizzato; le convenzioni qui seguite sono:
‹...›
;→
;|
; nel caso di possibili ambiguità, le alternative potranno essere racchiuse tra parentesi;[ ... ]
;
si noti che ‹a› [ ‹b› ] è ovviamente equivalente a ‹a› | ‹a› ‹b›;
{ ... }
;
in questo documento l'uso di parentesi graffe è sottoposto a una restrizione: la parentesi graffa deve sempre essere preceduta da un oggetto non opzionale;
in altri termini non sono qui utilizzate produzioni come ‹a› → [ ‹x› ] { ‹b› } o ‹a› → { ‹b› }
si noti che la produzione ‹a› → ‹x› { ‹b› } è ovviamente equivalente a ‹a› → ‹x› | ‹a› ‹b›;
‹cifra› → 0|1|2|3|4|5|6|7|8|9
‹lettera-iniziale› → A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|Q|S|U|V|W|X|Y|Z
‹lettera-riservata> → T|P|R
‹lettera-durata> → ‹lettera-iniziale›|P|R
‹lettera› → ‹lettera-iniziale> | ‹lettera-riservata>
Si può notare che sono utilizzate solo le lettere maiuscole dell'ISO 646.
Le lettere T
, P
ed R
sono riservate in quanto hanno un uso specifico nello standard ISO 646.
‹calendario-era› → ‹calendario› [ : ‹era› ] :
‹calendario› →
‹lettera-iniziale› ‹lettera› [ - ‹lettera› { ‹lettera› } ]
‹era› → ‹lettera› ‹lettera› [ - ‹lettera› { ‹lettera› } ]
Come si vede, i calendari sono indicati da due lettere (maiuscole) con eventualmente altre lettere aggiuntive,
da usare tipicamente per sottocasi dello stesso calendario; i codici sono predefiniti.
Nessun calendario può cominciare con la lettera T
, P
o R
, mentre invece ciò è possibile per le ere.
Va precisato che la'‹era›
qui utilizzata raggruppa due informazioni che in alcuni contesti sono separate:
l'era vera e propria (ovvero la scelta dell'anno iniziale di riferimento)
e lo stile (ovvero la scelta della data in cui si ha effettivamente il cambio di anno).
Qui si è preferito considerare un'unico codice che di fatto descrive la fase del calendario.
Esempi di ere e stili diversi usati per lo stesso calendario (in questo caso quello giuliano) sono:
Un repertorio di calendari e di ere è in fase di realizzazione. Esempi di codici proposti nel repertorio sono i seguenti:
In tutti i calendari di uso comune, l'unità di riferimento è il giorno. Un istante nel tempo è indicato attraverso la data (che descrive un multiplo del giorno in vari formati) e un'ora (che descrive una parte del giorno, anch'essa in vari formati)
Sia la data che l'ora sono descritte, in ogni calendario, attraverso una o più parti definite in base a motivazioni religiose, sociali o scientifiche. Alcune di queste parti sono individuate con dei numeri, mentre in altri casi si utilizzano denominazioni specifiche. Per avere una descrizione standardizzata non legata a localizzazioni, ogni nome di parte va sostituito da un numero, come per esempio 01 per gennaio, 02 per febbraio e così via. Una parte di una data o di un'ora è quindi una sequenza di cifre, come descritto nella produzione successiva.
‹parte› → ‹cifra› { ‹cifra› }
Va notato che, anche se la produzione non lo specifica, il numero di cifre di una parte à determinato a priori: se si sta rappresentando un mese, le cifre devono essere due, per un anno devono invece essere almeno 4.
La data è descritta attraverso una sequenza di parti che la compongono:
‹data incompleta› → ‹parte› { - ‹parte› }
‹data semplice› → [ ‹calendario-era› ] ‹data incompleta›
Le parti dipendono dal calendario in uso: nei calendari maggiormente usati, le parti sono l'anno, il mese e il giorno; è comunque possibile avere calendari con una diversa suddivisione del tempo, come per esempio il calendario Iso settimanale. Diamo di seguito alcuni esempi di date; nella stessa riga sono scritte date equivalente in base ai calendari ed ere di default.
GR:EC:2010 GR:2010 2010
GR:EC:2010-31-12 GR:2010-31-12 2010-31-12
GI:EC:1900-31-12 GI:1900-31-12
GI-N:EC:100 GI-N:100
GI-N:AS:99
JD:12345678
È infine utile definire tre date per rappresentare casi speciali: una data indefinita, la prima e l'ultima data utile del calendario.
‹data generica› → [ ‹calendario-era› ] *
‹data iniziale› → [ ‹calendario-era› ] *0
‹data finale› → [ ‹calendario-era› ] *9
‹data speciale› →
‹data generica›
| ‹data iniziale›
| ‹data finale›
La data generica (indicata con il solo *
)
rappresenta una qualunque possibile data del calendario,
la prima e l'ultima data utile
(indicate rispettivamente con *0
e *9
)
sono necessari in quei casi in cui si vuol
far riferimento a un periodo con un estremo indefinito
(l'uso di date della forma 9999-12-31 va infatti scoraggiato).
GR:EC:* GR:* *
GI-N:*0
GI-N:AS:*9
Anche per la suddivisione del giorno vi sono standard diversi. Deve quindi essere possibile indicare un «orario», ovvero una modalità di descrizione delle ore.
‹orario› → ‹lettera› ‹lettera› [ - ‹lettera› { ‹lettera› } ] :
Esempi di Orari di uso comune sono CN per indicare l'orario moderno a 24 ore,
AM e PM per le rispettive parti della modalità anglosassone «am/pm», e così via.
Anche in questo caso è in fase di realizzazione iniziale un repertorio di orari
Si può notare che per gli orari è ammessa la lettera T
come carattere iniziale.
Una importante componente dell'ora è la localizzazione; per la localizzazione si può utilizzare la seguente produzione:
‹base ora› → ‹parte› { : ‹parte› }
‹ora› → T [ ‹orario› ] ‹base ora› [ , ‹parte› ]
Come si vede, la lettera T
precede obbligatoriamente l'ora;
per questo motivo, per evitare ambiguità, non può essere utilizzata come primo carattere di un codice di calendario.
La componenete facoltativa ‹parte›
, preceduta da un virgola ,
permette di descrivere parti frazionarie dell'ora
o, per essere più precisi, parti frazionarie dell'ultima unità indicata nell'ora.
Diamo di seguito alcuni esempi di ore; nella stessa riga sono scritte ore equivalenti in base all'orario di default.
TNN:10 T10
TNN:00:00:00 T00:00:00
TNN:10:30:50 T10:30:50
TNN:24:00:00 T24:00:00
TAM:10:30:50
TPM:10:30:50
TNN:10,5
TNN:10:30:50,678
Gli ultimi due esempi descrivono l'uso della parte frazionaria: il primo dei due descrive le 10 e mezzo, il secondo fa riferimento al millesimo 678 delle ore 10, 30 minuti e 50 secondi.
In genere si usa un'ora localizzata, basata sull'uso del territorio in cui ci si trova. Nell'uso moderno è però spesso necessario far riferimento a un'ora universale, indipendente dal territorio considerato. Il tempo coordinato universale, usato a questo scopo, viene denominato UTC ; si noti che l'ordine delle tre lettere nell'acronimo è volutamente non correlato a una lingua specifica, allo scopo di evitare di dare prevalenza a una denominazione localizzata; il termine corrispondente è, per esempio Coordinated Universal Time in inglese, Temps universel coordonné in francese, ecc.).
L'ora UTC è formata dall'indicazione dell'ora locale con l'indicazione aggiuntiva di un codice della zona oraria. Per esempio, in Italia quando è in vigore l'ora solare la zona oraria è +01:00, e quindi il tempo UTC corrispondente a mezzogiorno va indicato come 12:00:00+01:00. Il mezzogiorno va indicato invece come 12:00:00+02:00 nel periodo di validità dell'ora solare.
Mentre quest'uso è utile quando si vogliano sincronizzare più attività a livello mondiale, la rappresentazione delle ore localizzate in questo modo può porre alcuni problemi nell'uso storico. Nello stesso tempo una eventuale informazione di localizzazione può essere utile. La soluzione proposta è descritta nella successiva produzione.
‹tempo utc› →
‹cifra› ‹cifra› [ : ‹cifra› ‹cifra› [ : ‹cifra› ‹cifra› ] ]
‹zona utc› →
Z
| ( - ‹tempo utc› )
| ( + ‹tempo utc› )
Questa produzione garantisce la compatibilità con il formato Iso 8601, in cui si utilizzano le zone orarie;
le cifre indicano un'ora ed eventuali minuti e secondi compresi tra -12:00:00 e +12:00:00.
Il +
identifica le zone orarie con longitudine Est e il -
una longitudine Ovest.
Il valore indicato rappresenta lo spostamento orario rispetto a quello UTC.
Quando si vuol far riferimento alla posizione locale del sole,
si può notare che un'ora corrisponde a 360°/24=15° di longitudine,
un minuto di tempo a 15' di longitudine
e un secondo di tempo a 15" di longitudine.
Per una località di longitudine 11°20'34" Est (Bologna) si dovrebbe indicare +00:45:22,
per la longitudine 6°15'57" (Dublino) si userebbe -00:25:03
e per la longitudine 30°20' (San Pietroburgo) si userebbe +02:01:20.
Va notato che attualmente si usa un'ora virtuale non necessariamente legata alla posizione del sole, per cui
la zona di Bologna è in effetti +01:00 (o +02:00 se è in vigore l'ora legale),
quella di Dublino è Z (corrispondente a +00:00 o -00:00)
mentre quella di San Pietroburgo è +03:00.
‹parte nome› → ‹lettera› { ‹lettera› }
‹parte codice› → ‹cifra› { ‹cifra› }
‹nome› → ‹parte nome› { _ ‹parte nome› }
‹codice› → ‹parte codice› { . ‹parte codice› }
‹localita› → @ ( ‹nome› | ‹codice› )
La produzione descritta permette invece di localizzare l'orario indicando la località di origine. La località può essere indicata con un nome; l'uso di un codice numerico permette di far riferimento a un possibile futuro sistema di codifica delle località.
‹localizzazione› → ‹zona utc› | ‹localita›
‹ora-localizzata› →
‹ora› [ ‹localizzazione› ]
Di seguito sono dati esempi di come si potrebbe indicare il mezzogiorno solare locale a Bologna, a Dublino e a San Pietroburgo, e, di seguito, l'indicazione del mezzogiorno in base alla zona UTC e non alla posizione reale del sole.
T12:00:00+00:45:22 T12:00:00@BOLOGNA
T12:00:00-00:25:03 T12:00:00@DUBLINO
T12:00:00+02:01:20 T12:00:00@SANKT_PETERBURG
T12:00:00+01:00
T12:00:00Z
T12:00:00+03:00
Come precedentemente notato, una data può essere indicata con diversi livelli di precisione che non sono necessariamente corrispondenti a una parte. Per permettere di definire in maniera precisa questa imprecisione, si utilizza la seguente produzione preliminare che definisce la struttura di base della data e ora:
‹data incompleta-ora-frazione› →
‹ora›
| ( ‹data incompleta› , ‹parte› )
| ( ‹data incompleta› [ ‹ora› ] )
‹data-ora-frazione› →
( ‹data semplice› [ ‹ora› ] )
Va notato che per la data e l'ora può essere presente, solo nell'ultima parte, una frazione preceduta da una virgola; per esempio 2010-02-03T06,5 individua le 6 e mezzo del 3 febbraio 2010, mentre 2010-02,5 individua il momento di mezzo del febbraio 2010 (ovvero il 15 febbraio alle ore 00:00:00).
Come precedentemente notato, una data può essere indicata con diversi livelli di precisione che non sono necessariamente corrispondenti a una parte. Per permettere di definire in maniera precisa questa imprecisione, si utilizza la seguente produzione preliminare:
‹data-ora-frazione iniziale› → ‹data-ora-frazione› | ‹data speciale›
( ‹data semplice› [ ‹ora› ] )
‹data-ora completa› →
‹data-ora-frazione›
| ‹data speciale›
| ( ‹data-ora-frazione› .. ‹data-ora-frazione› )
| ‹data speciale›
‹data incompleta-ora› →
‹data semplice›
# ‹data incompleta-ora-frazione›
.. ‹data incompleta-ora-frazione›
‹data-ora› → ‹data-ora completa› | ‹data incompleta-ora›
‹data-ora localizzata› → ‹data-ora› [ ‹localizzazione› ]
Per chiarire questa produzione, diamo alcuni esempi. I primi esempi utilizzano solo il primo ramo della produzione; Nei primi due esempi si utilizza la prima parte della prima produzione per indicare una data senza periodo esplicito di incertezza (a titolo informativo, il giorno giuliano indicato corrisponde alle ore 00:00:00 del 15 ottobre 1582); il terzo indica un periodo compreso tra il 1980 e il 2010 dC; il quarto mostra come si possono mescolare calendari indicando il perioro tra il primo decennio aC e il secondo decennio dC.
GR:EC:2010-12-31TCN:10:30:50,999 2010-12-31T10:30:50,999
JD:2299159,5
1980..2010
GI-N:10..GI:20
Di seguito vengono dati tempi imprecisi più complessi, con l'utilizzo di entrambe le produzioni; la seconda produzione è in realtà superflua ma permette di scrivere le date in maniera più compatta. nel primo esempio si indica un periodo compreso tra il 4 marzo e il 6 maggio del 2010; nel secondo si indica un periodo compreso tra il 4 e il 10 marzo del 2010; nel terzo si indica un periodo compreso tra le 10:10 e le 11:20 del 4 marzo del 2010; l'ultimo mostra una data e ora localizzata utilizando solo la produzione più compatta: vengono rappresentate il periodo corrispondente alle ore di luce (da 01 a 12) del 2 gennaio 1276 secondo il calendario giuliano a Bologna.
2010-03-04..2010-05-06 2010#03-04..05-06
2010-03-04..2010-03-10 2010-03#04..10
2010-03-04T10:10..2010-03-10T11:20 2010-03-04#T10:10..T11:20
GI:1276-01-02#TED01..TED12@BOLOGNA
Alcuni formati Iso 8601 non possono essere ricondotti alla definizione presente. In particolare, i formati privi di separatore (20100102T304050,999 per 2010-01-02T30:40:50,999), il formato settimanale (2010-W01-1, può essere reso come GR-IW:2010-01-1) e il formato ordinale (2010-123, può essere reso come GR-IO:2010-123).
‹parti durata› →
‹parte› ‹lettera-durata> { ‹parte› ‹lettera-durata> }
‹durata data› → [ ‹calendario-era› ] ‹parti durata›
‹durata ora› → T [ ‹orario› ] ‹parti durata›
‹durata› → P (
‹durata data›
| ‹durata data› ‹durata ora›
| ‹durata ora›
| ‹data-ora-frazione›
)
Come si vede, la lettera P
precede obbligatoriamente la durata;
per questo motivo, per evitare ambiguità, non può essere utilizzata come primo carattere di un codice di calendario.
Esempi di durate sono:
P10W
P10Y20M30D PGR:EC:10Y20M30D
P30DT10H20M PGR:EC:30DTCN:10H20M
PT10H20M PTCN:10H20M
P01-02-03T04:05
La produzione degli intervalli segue le regole dell'Iso 8601; gli intervalli sono suddivisi tra determinati e indeterminati e tra ripetuti e non.
La produzione avviene dando i due estremi dell'intervallo, ovvero l'inizio e la durata o la durata e la fine; la quarta produzione dell'Iso 8601 è trattata a parte come intervallo indeterminato ed è formata dalla sola durata.
‹separatore› → / | --
‹intervallo› →
( ‹data-ora› ‹separatore› ‹data-ora› )
| ( ‹data-ora› ‹separatore› ‹durata› )
| ( ‹durata› ‹separatore› ‹data-ora› )
‹intervallo localizzato› → ‹intervallo› [ ‹localizzazione› ]
‹intervallo indeterminato› → ‹durata›
‹intervallo ripetuto› → R ‹parte› / ‹intervallo›
‹intervallo ripetuto localizzato› →
‹intervallo ripetuto› [ ‹localizzazione› ]
Come si vede, la lettera R
precede obbligatoriamente l'intervallo ripetuto;
per questo motivo, per evitare ambiguità, non può essere utilizzata come primo carattere di un codice di calendario.
‹intervallo ripetuto indeterminato› → R (
( ‹parte› / ‹intervallo indeterminato› )
| ( / ‹intervallo indeterminato› )
| ( / ‹intervallo› )
)