Zielony Smok - logo witryny

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 dat
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 dat
tygodniowych
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.

Przykład 1
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
Przykład 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.

Daty porządkowe
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 czasu
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 czasu UTC
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 przesunięcia stref czasowych
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.