ISO 8601
ISO 8601は、日付と時刻の表記に関するISOの国際規格である。この規格の主眼は、日付と時刻の記述順序が国や文化によってまちまちであるものを、大→小の順序(ビッグエンディアン big-endian)を貫徹して、日付・時刻の記述順序をただ一種類に標準化していることにある。また、時刻表現は24時制だけに限定している。
2017年7月17日を、2017-07-17(拡張形式)もしくは20170717(基本形式)と表記する。
同日の時刻として 17時07分17.77秒 を併せて表記する場合は、2017-07-17T17:07:17.77(拡張形式)もしくは20170717T170717.77(基本形式)と表記する。すなわち記号 T で区切った後に時刻を続ける。
上記以外に、日の番号、暦週の番号、タイムゾーン、継続時間、期間などの記述方法についても規定している。
日本では、これに準拠して日本産業規格JIS X 0301「情報交換のためのデータ要素及び交換形式ー日付及び時刻の表記」が定められている。JISにおいては、元号(明治~令和)による年の規定を追加している。
規格のこれまでの経緯は次のとおりである。
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 (Date and time -- Representations for information interchange -- Part 1: Basic rules) および ISO 8601-2:2019 (Date and time -- Representations for information interchange -- Part 2: Extensions) の2分冊(2019年2月発行。2021年時点の最新版)
基本形式(基本表記・標準表記)と拡張形式(拡張表記)の2種類の表記方法があり、いずれも日付と時刻を記号 T で区切る。
基本形式では、日付と時刻それぞれの表記内には区切りを入れない。例えば、いま、年=YYYY(4桁の数字。グレゴリオ暦)、月=MM(2桁の数字。以下同様)、日=DD、時=hh、分=mm、秒=ss であって協定世界時(UTC)よりも09時間00分早い日本のような地域での表記は、基本形式では YYYYMMDDThhmmss+0900 となる。現地時刻は協定世界時にタイムゾーンの値を加減算した値になる。
拡張形式は、日付と時刻それぞれの表記内に区切りを入れて視認性を良好にした表記方法である。まず、年を表す4桁の数字の直後のハイフン (-) 区切りで、元号などのローカルな年月日表記ではないことを明らかにする。続く月と日の表記をハイフン (-) で区切る。基本形式と同様に日付と時刻を記号 T で区切り、時分秒の表記はコロン (:) で区切る。
末尾に、UTCならば記号 Z を付ける。他のタイムゾーンならばプラス記号 (+) またはマイナス記号 (−) で区切り、続けて時差を書く。拡張形式では、上記の例の場合は、YYYY-MM-DDThh:mm:ss+09:00 となる。
年月日と時分秒それぞれの区切りの符号には、ISOおよびJISによらない一般の慣習として、斜線「/」(2021/10/27)またはピリオド「.」(2021.10.27)が使われることがある。しかし、ISOおよびJISに従う場合、日付の表記では区切り記号にハイフン「-」だけを用い、時刻の表記では区切り記号にコロン「:」だけを用いる。ただし、日本において元号による年を表記する場合は、JIS X 0301に基づき、令04.10.27 または R04.10.27 のようにピリオドを用いる(#国家規格による拡張)。
日付と時刻との組合せにおいて基本形式と拡張形式との混在は許されず、どちらかに統一されていなければならない。
プログラミング言語の多くが拡張形式の日付を処理するようになっている。基本形式にも対応するものは必ずしも多くない。
グレゴリオ暦による年月日は、パリにおけるメートル条約の調印年月日を1875年5月20日とすることによって定義されている。
曜日は、2000年1月1日を土曜日とすることによって定義されている。
月日、時分秒の起点の指定は特にない。
ISO 8601 では日付の指定の仕方に、年と月と日を指定する方法、年と年内の日の番号を指定する方法、年と週と曜日を指定する方法の3つがある(下記に詳説)。
日付の表記にはグレゴリオ暦を用い、これはグレゴリオ暦が導入された1582年10月15日以前にも適用される(「先発グレゴリオ暦」も参照)。ただし、0000年から1582年の範囲は、事前に通信の送信側と受信側との間での合意がある場合にだけ使うことができる。一般(たとえばJavaライブラリ)には1582年以前の日付表現はユリウス暦と解釈されるが、ISO 8601 にはそのような措置はない。そのため、それらの日付表現をこのISO準拠にするにはグレゴリオ暦への換算が必要である。
年は(基本形式の場合でも拡張形式の場合でも)4桁の数字で表記される。
0000年より前または9999年より後の年を表記する場合には、事前に通信の送信側と受信側との間での合意が必要である。例えば、先頭に正負の符号(+あるいは-)を付して任意の桁数の数字を追加することができるという合意などである(任意の桁数の追加であるため年の桁数は5桁以上(正負の符号を含めると6桁以上)になりうる。)。なお、拡張表記の場合、事前の合意次第では+019332が有効であっても+000299は無効という場合がありうる。(西暦10000年問題も参照)
年の表記は 0001 が西暦1年を表し、0000 は紀元前1年、-0001 は紀元前2年、-0002 は紀元前3年である(天文学的紀年法と同じ)。これは通常の西暦紀元には西暦0年が存在しないためである(ちなみに0世紀も存在しない)。
月の表記は 01 から 12 の値を取り、それぞれ1月から12月を表す。
YYYYMMDD(基本形式)または YYYY-MM-DD(拡張形式) のいずれかで表記される。「年」が最初にあることを明らかにするため、また視認性を良くするために、この拡張表記がよく用いられている。
例:
20000401(基本形式)および 2000-04-01(拡張形式)は、いずれも2000年4月1日を表す。
YYYY-MM だけにして -DD を省くことも、YYYY だけにして MMDD(-MM-DD) を省くことも可能であり、その場合、前者は年月だけを、後者は年だけを表す。ただし、YYYYMM というようなハイフン(-)なしで数字6桁だけの表記は認められていない。
例:
2004-04
2004
20
2000年代。ただし、2000年から2099年までの100年間であり、21世紀(2001年から2100年まで)の100年間より1年前へずれている100年間である。原文ではcenturyと表現されているため注意が必要である(JIS X 0301ではcenturyを「百年代」と訳している)。
YYYY-DDD と表記する。
DDD は、年内の日の番号である。1月1日は 001 と表記し、12月31日は平年では 365 、閏年では 366 になる。
例:
2004-092 (2004092)
2004年の第92日目、すなわち4月1日を表す。
この記法では、年が、通常の場合の年とは異なる年になる場合がある。POSIXのstrftimeにある%Gはこの記法の年を表記する。JIS X 0301にも具体例の例示がある。
YYYY-Www-D と表記する。ww は年内の暦週の番号で、年の第1週は 01、最終週は 52 または 53 となる。
D は曜日を表し、月曜日が 1、日曜日は 7 である。「8」「9」は表記数値とされない(エラー扱い)。
例:
2004-W14-4 (2004W144)
2004年の第14週の木曜日、すなわち4月1日を表す。
この記法では、ある年における「最初の木曜日を含む週が、その年の第1週である。」と規定されている。
「その年の第1週は、1月4日を含む週である。」としても、基準としては等しい。
具体例を以下に示す。年初において以下の曜日に該当する場合、その日は新年第1週の日としてではなく、前年最終週の日として扱う。
1月1日金曜日・1月2日土曜日・1月3日日曜日
1月1日土曜日・1月2日日曜日
同様に、年末において以下の曜日に該当する場合、その日はその年の最終週の日としてではなく、次の年の第1週の日として扱う。
12月30日月曜日・12月31日火曜日
12月29日月曜日・12月30日火曜日・12月31日水曜日
時刻の表現は、24時制だけが規定されている。12時制のオプションは存在しない。
表記は hh:mm:ss の形式である。hh は時で 00 から 24 の値をとる。mm は分で 00 から 59 の値をとる。ss は秒で 00 から 59 及び閏秒に 60 の値をとる。ss, mm:ss の部分は省略可能で hh:mm, hh の形式も使用可能。
最も下の要素では小数値を用いることができる。小数点にはコンマ (,) が推奨されているが、ピリオド (.) を用いることもできる。
例:
11:30:30,5 (113030,5)
11時間30分30.5秒
11:30,5 (1130,5)
11:30:30 と等価。
11,5
11:30 と等価。
日の変わり目の表し方は2通り以上あり、00:00 と 24:00, 24:00:00 などで表すことができるが、00:00は日の初めで 24:00 は日の終わりを表す(2004-03-31T24:00Z は 2004-04-01T00:00Z と同じ時刻を表す)。
<date1> T <time1> のように日付と時刻の間にTを挟んで表記する。(例:2004-04-01T00:00:01+09:00=2004年04月01日00時00分01秒(JST)
時刻の後ろに Z を添えることで協定世界時(UTC)での時刻をそのまま示すことができる。
例:
2004-04-01T12:00Z (20040401T1200Z)
2004年4月1日12時00分(UTC)
UTC以外のタイムゾーン(時間帯)
UTCより先に進んでいる時間帯の場合はプラス(+)、UTCより後に遅れている時間帯の場合はマイナス(−)として、時刻の後ろに ±hh:mm, ±hhmm, ±hh のいずれかを添えることにより、表記の時刻がその時間帯(タイムゾーン)でのローカル時刻であることを示す。
例:
2004-04-01T12:00+09:00 (20040401T1200+0900)
2004年4月1日12時00分(JST)
継続時間は、ある期間中に含まれる時間の合計を定義し、P[n]Y[n]M[n]DT[n]H[n]M[n]S、または、右に示すように、P[n]Wの形式で表される。この表記において、[n]は、それぞれの日付と時間の要素に対応する値と置換する。先頭の0は必須ではないが、各要素の数字の最大文字数は通信者間で取り決める必要がある。大文字のP、Y、M、W、D、T、H、M、およびSは、各日付と時間の要素の指定子であり、他の文字には置き換えない。
P は期間を表す指定子(period を表す)であり、継続時間表現の先頭に置かれる。
Y は年の指定子であり、年を表す数値の後に置かれる。
M は月の指定子であり、月を表す数値の後に置かれる。
W は週の指定子であり、週を表す数値の後に置かれる。
D は日の指定子であり、日を表す数値の後に置かれる。
T 時間の指定子であり、継続時間表現の時間の部分の前に置く。
H は時間の指定子であり、時間を表す数値の後に置かれる。
M は分の指定子であり、分を表す数値の後に置かれる。
S は秒の指定子であり、秒を表す数値の後に置かれる。
たとえば、P3Y6M4DT12H30M5Sは、「3年、6か月、4日、12時間、30分、5秒」という継続時間を表現している。
指定子を含む日付と時間の要素は、その値が0の時には省略することができる。より低い順序の要素も精度を削減するために省略することができる。たとえば、P23DT23HとP4Yは、ともに許される継続期間の表現である。しかし、少なくとも1つの要素は表さなければならないため、Pは0秒という継続時間の表現としては不正である。しかし、PT0SやP0Dは、ともに有効であり、同じ継続時間を表現している。
曖昧さを解消するため、P1Mは1か月の継続時間であり、PT1Mは1分の継続時間である(時間指定子のTが時間の値の前に置かれていることに注意)。使用される最小の値には、半年を表現するP0.5Yのように、小数を含むこともできる。P0,5YやP0.5Yのように、小数点はカンマとフルストップのいずれも使用できる。標準は、下に述べる例外を除いて、日付と時間の継続時間表現において「繰り上がり点」を越えることを禁止してはいない。したがって、PT36Hという表現をP1DT12Hと同じ継続時間を表現するために使用することも可能である。ただし、サマータイムを切り替えた時にPT36HはP1DT12Hと同じではなくなることに留意する必要がある。
上記の表現の他に、通信者間の合意の元、日付と時間の表現に基づく継続時間のフォーマットを使用することも許されている。基本のフォーマットとしては、PYYYYMMDDThhmmss、または、拡張フォーマットとしては、P[YYYY]-[MM]-[DD]T[hh]:[mm]:[ss]が使用できる。しかし、日付と時間のそれぞれの値は、モジュロ演算における法を超えることは許されない(たとえば、月の値として13、時間の値として25などは許されない)。
標準では、継続時間は、次のセクションで説明する時間の期間の一部として記述されているものの、継続時間のフォーマットは時間の期間とは独立したものとして広く使用されている。
期間(time interval)は"開始日時/終了日時"で表記される。それぞれの日時は上述の日付あるいはそれに付属した時刻によって表記され、その2つの時刻の間に半角スラッシュ ("/") を挿入する。
例:
2004-04-01/2005-07-01
2004-04-01T12:00:00+09:00/2007-08-31T15:00:00+09:00
日本時間 (JST) で、2004年4月1日12時0分0秒から2007年8月31日15時0分0秒まで
なお期間の明示にあたっては、開始日時と終了日時で年あるいは年と月が同一である場合、それを省略することができる。
年が同一の場合の例:
2004-04-01/07-01
年と月が同一の場合の例:
2004-04-01/15
インターバルは "R[n]/" を先頭に付ける。nは繰り返し回数を意味する。[n]を省略した場合、または-1を指定すると無制限の繰り返しとみなされる。0の場合繰り返されないことを意味する。
例えば、"P1Y2M10DT2H30M" という継続時間を5回繰り返す場合、"R5/2008-03-01T13:00:00Z/P1Y2M10DT2H30M"になる。
日本産業規格 JIS X 0301(旧JIS C 6262)があり、ISO 8601:2000 の翻訳がX(英語題はISO 8601に同じ)に収められている。
規格では、「元号による日付」(和暦)が規定されている。
元号は「明」「大」「昭」「平」「令」または「M」「T」「S」「H」「R」であり、これらをメタ文字 N で表す。元治、慶応など明治よりも前の元号についての規定はない。
日付は、基本形式「YY.MM.DD」または拡張形式「NYY.MM.DD」で表される(元号での年も「YY」である)。このとき、年月日は2桁とし、1桁目のゼロは省略できない。年月日の区切り記号はハイフンではなくピリオドである(西暦年月日の場合は、2019-06-23のようにハイフンで区切る)。このピリオドは、基本形式においても省略できない。
例:
H16.04.01、R02.06.23
平16.04.01、令02.06.23
西暦を用いた場合の日付と時刻を併せた表現(例:2021-10-27T15:48:10.78)は、元号を用いる場合には規定されていない。つまり、R02.06.23T15:48:10.78 のような表現が許されるかどうかは規定されていない。
グレゴリオ暦に改暦されるM06.01.01(1873-01-01)以前の和暦は、太陰太陽暦(旧暦)であり、この規格の適用範囲外である。M01.01.01からM05.12.02までは1868年1月25日から1872年12月31日までを表すとされており、(ユリウス暦時代の西暦日付の扱いとは異なり)グレゴリオ暦として解釈されることはない。なお、立年改元に基づき、明治の初日はM01.01.01である。
中華民国国家標準 CNS 7648「資料元及交換格式・資訊交換・日期及時間的表示法」では、民国紀元が「R.O.C.」で表される。
例:
R.O.C.93-04-01
ほとんどのプログラミング言語で、日付および時刻を扱う方法は標準ライブラリに入っているか、別のライブラリがある。例えば、Java の場合は java.time パッケージで扱い、.NET Framework はラウンドトリップ書式指定子で、JavaScript は Date.toISOString() などで、Python は datetime.isoformat() などで扱える。