ISO 8601

ISO 8601は、日付と時刻の表記に関するISOの国際規格である。この規格の主眼は、日付と時刻の記述順序が国や文化によってまちまちであるものを、大→小の順序を貫徹して、日付・時刻の記述順序をただ一種類に標準化していることにある。

年月日の区切り記号は「-」のみを用い、「/」などを禁じている。また時刻表現を24時制だけに限定している。

2022年9月4日を、2022-09-04もしくは20220904と表記する。
2022年9月4日の時刻として 16時07分48.53秒 を併せて表記する場合は、2022-09-04T16:07:48.53または20220904T160748.53と表記する。すなわち記号 T で区切った後に時刻を続ける。上記以外に、日の番号、暦週の番号、タイムゾーン、継続時間、期間などの記述方法についても規定している。

日本では、これに準拠して日本産業規格JIS X 0301「情報交換のためのデータ要素及び交換形式ー日付及び時刻の表記」が定められている。JISにおいては、元号による年の規定を追加している。

1. 経緯
-----

規格のこれまでの経緯は次のとおりである。

ISO 2014:1976 Writing of calendar dates in all-numeric form
ISO 8601:1988 Data elements and interchange formats — Information interchange — Representation of dates and times
ISO 8601:2000 同上
ISO 8601:2004 同上
ISO 8601-1:2019  および ISO 8601-2:2019  の2分冊
ISO 8601-1:2019/Amd 1:2022 

2. 基本形式と拡張形式
------------

基本形式と拡張形式の2種類の表記方法があり、いずれも日付と時刻を記号 T で区切る。

基本形式では、日付と時刻それぞれの表記内には区切りを入れない。例えば、いま、年＝YYYY、月＝MM、日＝DD、時＝hh、分＝mm、秒＝ss であって協定世界時よりも09時間00分早い日本のような地域での表記は、基本形式では YYYYMMDDThhmmss+0900 となる。現地時刻は協定世界時にタイムゾーンの値を加減算した値になる。

拡張形式は、日付と時刻それぞれの表記内に区切りを入れて視認性を良好にした表記方法である。まず、年を表す4桁の数字の直後のハイフン  区切りで、元号などのローカルな年月日表記ではないことを明らかにする。続く月と日の表記をハイフン  で区切る。基本形式と同様に日付と時刻を記号 T で区切り、時分秒の表記はコロン  で区切る。

末尾に、UTCならば記号 Z を付ける。他のタイムゾーンならばプラス記号  またはマイナス記号  で区切り、続けて時差を書く。拡張形式では、上記の例の場合は、YYYY-MM-DDThh:mm:ss+09:00 となる。

年月日と時分秒それぞれの区切りの符号には、ISOおよびJISによらない一般の慣習として、斜線「/」またはピリオド「.」が使われることがある。しかし、ISOおよびJISに従う場合、日付の表記では区切り記号にハイフン「-」だけを用い、時刻の表記では区切り記号にコロン「:」だけを用いる。ただし、日本において元号による年を表記する場合は、JIS X 0301に基づき、令04.09.27 または R04.09.27 のようにピリオドを用いる。

日付と時刻との組合せにおいて基本形式と拡張形式との混在は許されず、どちらかに統一されていなければならない。

プログラミング言語の多くが拡張形式の日付を処理するようになっている。基本形式にも対応するものは必ずしも多くない。

3. 起点
-----

グレゴリオ暦による年月日は、パリにおけるメートル条約の調印年月日を1875年5月20日とすることによって定義されている。

曜日は、2000年1月1日を土曜日とすることによって定義されている。

週の最初の日は、月曜日である。

月日、時分秒の起点の指定は特にない。

4. 日付
-----

ISO 8601 では日付の指定の仕方に、年と月と日を指定する方法、年と年内の日の番号を指定する方法、年と週と曜日を指定する方法の3つがある。

4.1. 年の表記
---------

日付の表記にはグレゴリオ暦を用いる。これはグレゴリオ暦が導入された1582年10月15日以前にも適用される。ただし、0000年から1582年の範囲は、事前に通信の送信側と受信側との間での合意がある場合にだけ使うことができる。一般には1582年以前の日付表現はユリウス暦と解釈されるが、ISO 8601 にはそのような措置はない。そのため、それらの日付表現をこのISO準拠にするにはグレゴリオ暦への換算が必要である。

年は4桁の数字で表記される。

4.2. 年の表記
---------

0000年より前または9999年より後の年を表記する場合には、事前に通信の送信側と受信側との間での合意が必要である。例えば、先頭に正負の符号を付して任意の桁数の数字を追加することができるという合意などである。なお、拡張表記の場合、事前の合意次第では+019332が有効であっても+000299は無効という場合がありうる。
年の表記は 0001 が西暦1年を表し、0000 は紀元前1年、-0001 は紀元前2年、-0002 は紀元前3年である。これは通常の西暦紀元には西暦0年が存在しないためである。

4.3. 月の表記
---------

月の表記は 01 から 12 の値を取り、それぞれ1月から12月を表す。

4.4. 年と月と日
----------

//または // のいずれかで表記される。「年」が最初にあることを明らかにするため、また視認性を良くするために、この拡張表記がよく用いられている。

例:
20220904および 2022-09-04は、いずれも2022年9月4日を表す。// だけにして // を省くことも、// だけにして // を省くことも可能であり、その場合、前者は年月だけを、後者は年だけを表す。ただし、// というようなハイフンなしで数字6桁だけの表記は認められていない。

例:
2004-04 2004年4月
2004 2004年
20 2000年代。ただし、2000年から2099年までの100年間であり、21世紀の100年間より1年前へずれている100年間である。原文ではcenturyと表現されているため注意が必要である。

4.5. 年と年内の日の番号
--------------

// と表記する。// は、年内の日の番号である。1月1日は 001 と表記し、12月31日は平年では 365 、閏年では 366 になる。

例:
2004-092  2004年の第92日目、すなわち4月1日を表す。

4.6. 年と週と曜日
-----------

この記法では、年が、通常の場合の年とは異なる年になる場合がある。POSIXのstrftimeにある%Gはこの記法の年を表記する。JIS X 0301にも具体例の例示がある。

// は年内の暦週の番号で、年の第1週は 01、最終週は 52 または 53 となる。

// は曜日を表し、月曜日が 1、日曜日は 7 である。「8」「9」は表記数値とされない。
例:
2004-W14-4  2004年の第14週の木曜日、すなわち4月1日を表す。この記法では、ある年における「最初の木曜日を含む週が、その年の第1週である。」と規定されている。

「その年の第1週は、1月4日を含む週である。」としても、基準としては等しい。
具体例を以下に示す。年初において以下の曜日に該当する場合、その日は新年第1週の日としてではなく、前年最終週の日として扱う。
1月1日金曜日・1月2日土曜日・1月3日日曜日
1月1日土曜日・1月2日日曜日
1月1日日曜日
同様に、年末において以下の曜日に該当する場合、その日はその年の最終週の日としてではなく、次の年の第1週の日として扱う。
12月31日月曜日
12月30日月曜日・12月31日火曜日
12月29日月曜日・12月30日火曜日・12月31日水曜日

5. 時刻
-----

時刻の表現は、24時制だけが規定されている。12時制のオプションは存在しない。 表記は // は時で 00 から 24 の値をとる。// は分で 00 から 59 の値をとる。// は秒で 00 から 59 及び閏秒に 60 の値をとる。//, // の形式も使用可能である。

最も下の要素では小数値を用いることができる。小数点にはコンマ  が推奨されているが、ピリオド  を用いることもできる。日本ではピリオドを用いることがほとんである。

例:
18:30:09.57  18時30分09.57秒
18:30.25  18時30.25分 = 18時30分15秒 18:30:15 と等価
18.7225 18.7225時 = 18時43分21秒 18:43:21 と等価日の変わり目の表し方は2通り以上あり、00:00 と 24:00, 24:00:00 などで表すことができるが、00:00は日の初めで 24:00 は日の終わりを表す。

6. 日付と時刻の組合せ
------------

// T // のように日付と時刻の間にTを挟んで表記する。