ISO 8601

ISO 8601 – międzynarodowa norma ISO określająca sposób zapisu daty i czasu. Obecna wersja (ISO 8601:2004) jest trzecią edycją dokumentu, datowaną na 2004-12-03. Zastępuje ona pierwszą edycję – ISO 8601:1988 – oraz drugą edycję – ISO 8601:2000. Polski odpowiednik to norma PN-EN 28601:2002[1] (poprzednio PN-82/01204 i PN-90/N-01204) wycofana w dniu 2008-05-29 bez zastąpienia. Stosowaniu standardu ISO 8601 w protokołach internetowych poświęcony jest RFC 3339 ↓.

Podstawowa koncepcja tego standardu polega na ustaleniu momentu w czasie z dokładnością ustaloną przez użytkownika za pomocą odpowiednio sformatowanych ciągów znaków ustawionych w porządku od najbardziej znaczących (rok) do najmniej znaczących (sekundy bądź ich części). Norma określa numeryczny format daty i czasu (bez używania nazw miesięcy, dni tygodnia czy literowych oznaczeń czasu przed lub po południu).

Zapis daty

W standardzie ISO 8601 daty mogą być przedstawione na trzy różne sposoby: daty kalendarzowe, daty porządkowe i daty tygodniowe. Standard korzysta z kalendarza gregoriańskiego. Należy zwrócić uwagę, że rok 0001 w standardzie ISO 8601 oznacza 1 rok n.e., poprzedni – 0000 – oznacza rok 1 p.n.e., a –0001 to rok 2 p.n.e. itd. Dla uniknięcia dwuznaczności rok powinien być zapisywany za pomocą czterech cyfr.

Daty kalendarzowe

Data kalendarzowa to data, w której dzień jest liczony kolejno w każdym miesiącu. Np. 2 stycznia to data kalendarzowa. W standardzie ISO 8601 data kalendarzowa ma format YYYY-MM-DD, czyli 2 dzień stycznia w roku 2005 zapisywany jest jako 2005-01-02. Można również opuścić separatory, zapisując datę w sposób 20050102. Format z separatorami to format rozszerzony, a bez to format podstawowy. Standard pozwala na przedstawianie dat z mniejszą precyzją: można zapisać 2005-01, co oznacza styczeń roku 2005.

Daty porządkowe

Data porządkowa to taka, w której dzień jest przedstawiony jako kolejny w całym roku, za pomocą trzech znaków z wiodącymi zerami. 2 stycznia to 002, 1 lutego to 032, itd. 31 grudnia to 365 lub 366 w latach przestępnych. Data porządkowa ma format YYYY-DDD. 2 stycznia 2005 zapisywany jest jako 2005-002, a w formacie podstawowym 2005002.

Daty tygodniowe

Data tygodniowa to taka, w której dzień jest oznaczany jako kolejny w kolejnym tygodniu roku. Tydzień oznaczany jest dwiema cyframi od 01 do 52 lub 53. Dzień oznaczany jest jedną cyfrą, od 1poniedziałek do 7niedziela. Format daty tygodniowej to YYYY-Www-D. Np. 2 lutego 2005 to 2005-W05-3 lub w zapisie podstawowym 2005W053 – trzeci dzień (środa) piątego tygodnia roku 2005.

Pierwszy tydzień roku to taki, w którym są przynajmniej 4 dni stycznia. Inaczej mówiąc, taki, w którym jest pierwszy czwartek stycznia lub dzień 4 stycznia. To oznacza, że tydzień 01 może zawierać dni z poprzedniego roku, a tydzień 53 – dni z następnego roku. Np. 1 stycznia 2005 wypadł w sobotę, więc 2004-W53 trwa od 27 grudnia 2004 do 2 stycznia 2005, a 2005-W01 zaczyna się 3 stycznia 2005 roku. Data kalendarzowa 2005-01-02 to data tygodniowa 2004-W53-7.

Zapis czasu

Standard używa czasu 24-godzinego. Format podstawowy to hhmmss, a rozszerzony to hh:mm:ss. Można oczywiście użyć mniejszej precyzji: hh:mm, hhmm lub hh.

Można również używać części sekund, minut lub godzin, zaznaczając to znakiem dziesiętnym: kropką lub przecinkiem w zależności od lokalnych ustaleń. Dzielić można tylko najmniej znaczącą część, więc, zapisując np. 14 godzin, 30 i pół minuty, nie umieszczamy sekund: 14:30,5.

Północ oznaczana jest zarówno 00:00 jak i 24:00. Np. 24:00 31 grudnia 2004 to ten sam moment co 00:00 1 stycznia 2005.

Strefy czasowe

Oznaczenia czasu UTC dokonuje się przez umieszczenie litery Z po czasie. Np. godzina 9:30 czasu UTC oznaczana jest 09:30Z lub 0930Z.

Inne strefy czasowe oznacza się, zaznaczając ich przesunięcie (offset) względem czasu UTC, w formacie ±hh:mm, ±hhmm lub ±hh. Standardowy czas geograficzny w Polsce (zwany zwyczajowo czasem zimowym) jest przesunięty o godzinę do przodu w stosunku do czasu UTC, a czas letni – o dwie godziny. Godzina 15:30 w Polsce w zimie zapisywana jest jako 15:30+01 i oznacza ten sam czas co 14:30Z.

Łączny zapis daty i czasu

Łącznie datę i czas w standardzie ISO 8601 zapisuje się, wstawiając literę T między zapis daty i czasu. Powszechnie używany jest zapis YYYY-MM-DDThh:mm:ss±hh:mm, np. 2005-01-02T03:01:45+01:00. Dopuszczalne i stosowane jest także rozdzielanie daty od czasu przy pomocy spacji: YYYY-MM-DD hh:mm:ss ±hh:mm[1].

Aktualny czas UTC podany w rozszerzonym wariancie standardu ISO 8601: 2022-12-16T12:17:06Z []

Przykłady użycia

Polecenie date w konsoli systemów z rodziny Unix:

echo "Format rozszerzony YYYY-MM-DDThh:mm:ssZ"
date -u +%Y-%m-%dT%H:%M:%SZ
echo "Format podstawowy YYYYMMDDThhmmssZ"
date -u +%Y%m%dT%H%M%SZ
echo "Format podstawowy mniejszej precyzji YYYYMMDDThhmm"
date -u +%Y%m%dT%H%MZ
# date -I[FORMAT], --iso-8601[=FORMAT]  wypisanie daty/czasu w formacie ISO 8601.
# FORMAT=„date” dla podania samej daty (tryb domyślny), „hours” (godziny), „minutes”,
# „seconds” albo „ns” dla podania daty i czasu z pożądaną dokładnością.
date --iso-8601="minutes"

Funkcja date() w PHP:

<?php
$timeoffset = intval(date("Z"));
echo date("Y-m-d\TH:i:s\Z",time()-$timeoffset);
echo"\n";
// PHP 5 lub nowsze:
echo date("c"); // 2004-02-12T15:19:21+00:00
echo"\n";
?>

Funkcja Date#toISOString() w JavaScript:

let date = new Date('05 October 2011 14:48 UTC')

console.log(date.toISOString()) // powinno wyświetlić w konsoli 2011-10-05T14:48:00.000Z

Przypisy

  1. a b PN-EN 28601:2002 - wersja polska, sklep.pkn.pl [dostęp 2017-11-23] [zarchiwizowane z adresu 2017-12-15] (pol.).

Linki zewnętrzne