Norma ISO-8601:2004
Międzynarodowa norma określająca sposób zapisu daty i czasu dnia. Jest to trzecia wersja tej normy.
W Polsce była stosowana jako PN-N-01204:1990, potem EN 28601:1992, potem PN-EN 28601:2002. Ta ostatnia wersja została odwołana 29 maja 2008 roku bez zastąpienia.
Norma ta w Polsce nie obowiązuje. Wszystko co napisano poniżej pochodzi z międzynarodowej wersji tej normy. Terminy podawane są w moim tłumaczeniu.
Znajomość tej normy jest konieczna, gdyż daty i czas w pakiecie java.time
są zgodne z tą normą.
Wprowadzenie
Zadaniem normy jest przede wszystkim ujednolicenie sposobów zapisu dat i czasu, wyeliminowanie pomyłek przy transferze zapisów między krajami, w których obowiązują odmienne formaty zapisu daty i czasu.
Norma bazuje na kalendarzu gregoriańskim.
Zasady ogólne
Daty i jednostki czasu są zapisywane od lewej do prawej, od największej do najmniejszej:
rok, miesiąc (albo tydzień), dzień, godzina, minuty, sekundy, ułamki sekund. Zapewnia to możliwość chronologicznego sortowania, z wyjątkiem lat ujemnych.
Wszystkie jednostki czasu wymagają określonej liczby cyfr do zapisu, np. rok YYYY wymaga r cyfr. Jeżeli podawana liczba zawiera mniej cyfr, należy dodać czołowe zera np rok 2 będzie zapisany jako 0002.
Daty mogą być podawane w dwóch formatach: uproszczonym przewidzianym dla komputerów i rozszerzonym, lepiej czytelnym dla człowieka. Zakłada się, że w tekstach zawsze będą używane zapisy w formacie rozszerzonym. Jednostki takie jak rok, miesiąc, tydzień i dzień są oddzielane łącznikiem (hyphen), natomiast godziny, minuty i sekundy są oddzielane dwukropkiem (colon).
Gdy pełna dokładność nie jest konieczna, zapis można zredukować przez kolejne obcinanie jednostek z prawej. Np. zapis 1904-06-04 może być skrócony przez usunięcie dni. Zasada obcinania z prawej zapewnia, że w zapisie 1904-06 liczby 06 zawsze będą rozumiane jako miesiąc, a nie jako dzień albo jako zakres lat 1904 – 1906.
Daty
Kalendarz juliański obowiązywał od 4 r n.e. do 4 października 1582 r. włącznie Proleptyczny kalendarz juliański to kalendarz juliański obejmujący daty przed powstaniem kalendarza juliańskiego.
Kalendarz gregoriański został wprowadzony z datą 15 października 1582 r. Dni 5-14 października nigdy nie istniały. Kalendarz gregoriański obejmujący daty wcześniejsze niż data jego powstania jest nazywany proleptycznym kalendarzem gregoriańskim.
Kalendarz gregoriański w różnych krajach został przyjęty w różnych terminach. W Polsce został przyjęty od razu.
Kalendarz gregoriański różni się od kalendarza juliańskiego jedynie sposobem naliczania lat przestępnych.
Norma za punkt referencyjny proponowanej wersji kalendarza przyjmuje datę 20 maja 1875 r, czyli datę przyjęcia konwencji metra, ale nie zmienia to faktu, że przyjęty sposób rozliczania zapewnia pełną zgodność tego kalendarza z kalendarzem gregoriańskim od dnia powstania kalendarza do dzisiaj.
Ponieważ przyjęta wersja zapisu dat nie pozwala na istnienie jakichkolwiek nieciągłości norma przyjmuje, że datą poprzedzającą dzień 15 X 1582 r. był dzień 14 X 1582 r. Proleptyczna cześć tej wersji kalendarza sięgająca roku 0 naszej ery, jest niekompatybilna z kalendarzem gregoriańskim. Dokumentacja zakłada, że daty kalendarza proleptycznego będą używane w komunikacji między stronami za ich obopólną wiedzą i zgodą (żeby uniknąć niejasności).
Lata
Rok powinien być zapisywany w formacie 4-cyfrowym YYYY. Kalendarz reprezentuje lata od 0000 do 9999. Rok 0000 jest to rok. 1 p.n.e, pozostałe lata są latami n.e. Lata od 0000 do 1582 są dozwolone jedynie za obopólną zgodą partnerów wymieniających informację.
Lata przed rokiem 0000 mogą być uwzględnione jako ujemne, również jedynie za obopólną zgodą stron wymiany informacji. Rok 0000 to 1 p.n.e, rok rok -0001 to 2 r p.n.e, rok -0002 to 3 r p.n.e.
Za zgodą stron komunikacji można – w razie potrzeby – dodać określoną liczbę cyfr przed rokiem [±YYYY] (podkreślenie oznacza dowolną liczbę cyfr). Konieczne jest wtedy umieszczanie znaku plus albo minus. Gdybyśmy potrzebowali roku -120001 możemy umówić się na zastosowanie dodatkowych 2 cyfr, np. -120001 oznacza rok 120000 p.n.e, a rok +001952 rok 1952 n.e.
Daty kalendarzowe
Y oznacza rok liczony od 0000, M – oznacza miesiąc liczony od 01, D oznacza dzień liczony od 01
Format podstawowy | Przykład | Format roszerzony | Przykład |
---|---|---|---|
YYYYMMDD | 19520604 | YYYY-MM-DD | 1952-06-04 |
YYYYMM | 195206 | YYYY-MM | 1952-06 |
–MMDD | –0604 | –MM-DD | –06-04 |
Daty tygodniowe
[Www] oznacza zapisywanie numerów tygodni. W – jest stałą po której następuje numer tygodnia liczony od 01 do
53.
[WwwD] oznacza to samo, przy czym D oznacza dzień tygodnia, gdzie 1 oznacza poniedziałek, 2 wtorek, …, a 7
niedzielę.
YYYY – oznacza rok tygodniowy – zobacz poniżej.
Format podstawowy | Przykład | Format roszerzony | Przykład |
---|---|---|---|
YYYYWww | 1964W04 | YYYY-Www | 1964-W04 |
YYYYWwwD | 1964W043 | YYYY-Www-D | 1964-W04-3 |
Pierwszy tydzień roku
Problem jest z pierwszym tygodniem roku, gdyż tydzień może zaczynać się w jednym, a kończyć w roku następnym.
Oficjalna definicja ISO mówi, że pierwszy tydzień roku to ‘tydzień, który zawiera pierwszy czwartek tego roku’. Można również powiedzieć, że jest to ‘tydzień, w którym przypada 4 stycznia’. Równoważne jest stwierdzenie, że jest to ‘pierwszy tydzień roku mający w tym roku co najmniej swoje 4 dni’.
Jeśli 1 stycznia przypada na poniedziałek, wtorek, środę lub czwartek – to ten tydzień należy do tego roku i ma numer W01. Jeżeli 1 stycznia przypada na piątek, sobotę albo niedzielę to jest to W52 lub W53 tydzień
poprzedzającego roku.
Rok tygodniowy
Rok tygodniowy (week-numbering year, rok wyznaczany tygodniami) to rok rozpoczynający się w poniedziałek w tygodniu W01 i kończący w niedzielę, kończącą ostatni pełny tydzień roku). Zawiera 52 lub 53 pełne tygodnie.
Data | Dzień tygodnia | Zapis tygodniowy |
---|---|---|
2012-12-29 | sobota | 2012-W52-6 |
2012-12-30 | niedziela | 2012-W52-7 |
2012-12-31 | poniedziałek | 2013-W01-1 |
2013-01-01 | wtorek | 2013-W01-2 |
Data | Dzień tygodnia | Zapis tygodniowy |
---|---|---|
2015-12-30 | środa | 2015-W53-3 |
2015-12-31 | czwartek | 2015-W53-4 |
2016-01-01 | piątek | 2015-W53-5 |
2016-01-02 | sobota | 2015-W53-6 |
2016-01-03 | niedziela | 2015-W53-7 |
2016-01-04 | poniedziałek | 2016-W01-1 |
Daty porządkowe
Daty porządkowe (ordinal dates) to daty zawierające numer dnia w roku liczony od 001 do 365 w lata
zwykłe albo od 001 do 366 w lata przestępne.
YYYY oznacza rok kalendarzowy, a DDD oznacza dzień roku.
Format podstawowy | Przykład | Format rozszerzony | Przykład |
---|---|---|---|
YYYYDDD | 1981095 | YYYY-DDD | 1981-095 |
Ta data oznacza 1981-04-05.
Czasy
Używany jest zegar 24 godzinny.
hh – oznacza godziny liczone od 00 do 24 (24 oznacza jedynie północ tego dnia)
mm – oznacza minuty liczone od 00 do 59
ss – oznacza sekundy liczone od 00 do 60 (60 jest używane w przypadku doliczania sekundy przestępnej)
.sss – oznacza ewentualną frakcję dziesiętną. Frakcja może być dodana po sekundach. W formatach skróconych może yć dodana jako frakcja ostatniej uwzględnionej jednostki, czyli może to być zarówno frakcja minut jak i frakcja
godzin. Do oddzielania frakcji można użyć przecinka (coma) albo kropki (dot), ale ta norma wyraźnie preferuje kropkę. Liczba miejsc dziesiętnych jest dowolna, ale powinna być uzgodniona między stronami komunikacji.
Format podstawowy | Przykład | Format rozszerzony | Przykład |
---|---|---|---|
hhhhss.sss | 121212.12 | hh:mm:ss.sss | 12:12:12.12 |
hhmmss | 121212 | hh:mm:ss | 12:12:12 |
hhmm | 1212 | hh:mm | 12:12 |
hh | 12 | hh | 12 |
Północ może być oznaczona jako 00:00 albo 24:00, ale z zasady przyjmuje się, że północ tego dnia jest oznaczana 00:00, a północ następnego dnia też 00:00. Użycie 24:00 oznacza 00:00 następnego dnia.
Strefy czasowe
Jeśli strefa czasowa nie jest opisana, uważa się, że podany czas jest czasem lokalnym. Może też być czasem UTC ewentualnie z podanym przesunięciem (offset).
UTC
Jeśli czas jest UTC po czasie dopisuje się (bez odstępu) literę Z.
Format podstawowy | Przykład | Format rozszerzony | Przykład |
---|---|---|---|
<time>±hhmm | 223022Z | – | 22:30:22Z |
Przesunięcie stref czasowych
Znak ‘-‘ jest albo łącznikiem (hyphen) albo minusem (minus sign). Powinno używać się znaku
minus, a łącznika jedynie wtedy, gdy znak minus nie jest dostępny.
Format podstawowy | Przykład | Format rozszerzony | Przykład |
---|---|---|---|
<time>±hhmm | 222010-0100 | <time>±hh:mm | 22:20:10-01:00 |
<time>±hh | 222010+01 | – | 22:20:10+01 |
Łączny zapis daty czasu
Data i czas mogą być połączone przy użyciu litery T:
<date>T<time> 20101004T143010, 2010-10-04T14:30:10
albo
<date>T<time><zone>20101004T143010Z, 2010-10-04T14:30:10Z
Zarówno data jak i czas muszą używać tego samego formatu: podstawowego albo rozszerzonego. Data może być kalendarzowa, tygodniowa lub porządkowa, ale musi być kompletną datą.
Za zgodą stron komunikacji litera T może być pominięta.
Czas trwania
Czas trwania (duration) są składnikami przedziałów czasowych omówionych poniżej i powinny być używane tylko jako część tych przedziałów.
Format przedziału czasu to:
P[n]Y[n]M[n]DT[n]H[n]M[n]S albo
PnW
P<date>T<time>
- P jak okres (period)
- nY – liczba lat (year), np. 5Y
- nM – liczba miesięcy, np. 3M
- nD – liczba dni, np. 3D
- T – oddziela daty od czasu
- nH – liczba godzin, 4H
- nM – liczba minut, 15M
- nS – liczba sekund, 32S
Całość można zapisać jako P5Y3M3DT4H15M32S.
Wartość zerowe daty i czasu mogą być pominięte. P5Y – oznacza okres pięciu lat, P5Y32S oznacza 5 lat i 32 sekundy, P1M – oznacza okres 1 miesiąca, a PT1M – okres jednej minuty.
Wartości najmniejsze mogą być podane jako frakcje .sss oddzielone kropką albo przecinkiem.
Można używać większej ilości mniejszej jednostek, bez podwyższania liczby jednostek wyższych PT34H oznacza ten sam okres czasu co P1DT10H.
Za zgodą stron komunikacji można wprowadzić format podstawowy PYYYYMMDDThmmss albo rozszerzony PYYYY-MM-DDThh:mm:ss
Okres P5Y3M3DT4H15M32S będzie np. zapisany jako P0005-03-03T04:15:32, ale w tym przypadku żadna liczba nie może przekraczać swojego modułu, np. liczba miesięcy nie może być większa niż 11, liczba godzin większa niż 23, etc.
Okres liczony w tygodniach może być podany jako PnW. P4W oznacza cztery tygodnie.
Przedziały czasowe
Przedział czasu (time interval) jest wyznaczany przez dwa punty czasowe: rozpoczęcia <start> i zakończenia <end>. Miarą czasu upływającego między nimi jest czas trwania <duration>, który omówiony był wyżej. <duration> oznacza okres czasu bez punktu odniesienia na osi czasowej. <start> i <end> mogą być podane jako kombinacje daty i czasu albo tylko jako daty
Przedział czasowy możemy wyrazić jako:
<start>/<end> np. 2007-03-01T13:00:00Z/2008-05-11T15:30:00Z
<start>/<duration> np. 2007-03-01T13:00:00Z/P1Y2M10DT2H30M
<duration>/<end> np. P1Y2M10DT2H30M/2008-05-11T15:30:00Z
<duration> np. P1Y2M10DT2H30M (wymaga dodatkowego wyjaśnienia)
Wartości oddzielone są przez slash (solidus).
Krótkie okresy mogą być zapisywane skrótowo: 2017-12-14T13:30/15:30 implikuje, że po prawej stronie znajduje się /2017-12-14T15:30.
2008-02-15/03-14 implikuje, że po prawej stronie znajduje się /2008-03-14.
Powtarzające się przedziały czasowe
Powtarzające się przedziały czasu (recurring time intervals) powinny być zapisywane jako:
Rnn/<interval>
R/<interval>
gdzie r jest stałą, a nn oznacza liczbę powtórzeń. Jeżeli liczba nn nie jest podana liczba powtórzeń jest nieokreślona. Jeśli interwał podaje <start> to jest to początek powtarzającego się przedziału. Jeśli interwał obejmuje <end>, ale nie <start>, to jest to koniec powtarzającego się przedziału.
Gdybyśmy chcieli powtórzyć okres czasu P1Y2M10DT2H30M trzy razy zaczynając od 2008-03-01T13:00:00Z powinniśmy zapisać R3/2008-03-01T13:00:00Z/P1Y2M10DT2H30M.