ISO 8601

ISO 8601は、日付と時刻の表記に関するISOの国際規格である。この規格の主眼は、日付と時刻の記述順序が国や文化によってまちまちであるものを、大→小の順序（ビッグエンディアン big-endian）を貫徹して、日付・時刻の記述順序をただ一種類に標準化していることにある。
年月日の区切り記号は「-」（ハイフン）のみを用い、「/」などを禁じている。また時刻表現を24時制だけに限定している。
上記以外に、日の番号、暦週の番号、タイムゾーン、継続時間、期間などの記述方法についても規定している。 
日本では、これに準拠して日本産業規格JIS X 0301「情報交換のためのデータ要素及び交換形式ー日付及び時刻の表記」が定められている。JISにおいては、元号（明治～令和）による年の規定を追加している。
経緯.
規格のこれまでの経緯は次のとおりである。
基本形式と拡張形式.
基本形式（基本表記・標準表記）と拡張形式（拡張表記）の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によらない一般の慣習として、斜線「/」（2022/09/27）またはピリオド「.」（2022.09.27）が使われることがある。しかし、ISOおよびJISに従う場合、日付の表記では区切り記号にハイフン「-」だけを用い、時刻の表記では区切り記号にコロン「:」だけを用いる。ただし、日本において元号による年を表記する場合は、JIS X 0301に基づき、令04.09.27 または R04.09.27 のようにピリオドを用いる（#国家規格による拡張）。
日付と時刻との組合せにおいて基本形式と拡張形式との混在は許されず、どちらかに統一されていなければならない。
プログラミング言語の多くが拡張形式の日付を処理するようになっている。基本形式にも対応するものは必ずしも多くない。
起点.
グレゴリオ暦による年月日は、パリにおけるメートル条約の調印年月日を1875年5月20日とすることによって定義されている。
曜日は、2000年1月1日を土曜日とすることによって定義されている。
週の最初の日は、月曜日である。
月日、時分秒の起点の指定は特にない。
日付.
ISO 8601 では日付の指定の仕方に、年と月と日を指定する方法、年と年内の日の番号を指定する方法、年と週と曜日を指定する方法の3つがある（下記に詳説）。
年の表記（0000年～9999年）.
日付の表記にはグレゴリオ暦を用いる。これはグレゴリオ暦が導入された1582年10月15日以前にも適用される（「先発グレゴリオ暦」も参照）。ただし、0000年から1582年の範囲は、事前に通信の送信側と受信側との間での合意がある場合にだけ使うことができる。一般（たとえばJavaライブラリ）には1582年以前の日付表現はユリウス暦と解釈されるが、ISO 8601 にはそのような措置はない。そのため、それらの日付表現をこのISO準拠にするにはグレゴリオ暦への換算が必要である。
年は（基本形式の場合でも拡張形式の場合でも）4桁の数字で表記される。
月の表記.
月の表記は 01 から 12 の値を取り、それぞれ1月から12月を表す。
年と月と日.
YYYYMMDD（基本形式）または YYYY-MM-DD（拡張形式） のいずれかで表記される。「年」が最初にあることを明らかにするため、また視認性を良くするために、この拡張表記がよく用いられている。
YYYY-MM だけにして -DD を省くことも、YYYY だけにして MMDD(-MM-DD) を省くことも可能であり、その場合、前者は年月だけを、後者は年だけを表す。ただし、YYYYMM というようなハイフン（-）なしで数字6桁だけの表記は認められていない。
年と年内の日の番号.
YYYY-DDD と表記する。
DDD は、年内の日の番号である。1月1日は 001 と表記し、12月31日は平年では 365 、閏年では 366 になる。
年と週と曜日.
この記法では、年が、通常の場合の年とは異なる年になる場合がある。POSIXのstrftimeにある%Gはこの記法の年を表記する。JIS X 0301にも具体例の例示がある。
YYYY-"W"ww-D と表記する。ww は年内の暦週の番号で、年の第1週は 01、最終週は 52 または 53 となる。
この記法では、ある年における「最初の木曜日を含む週が、その年の第1週である。」と規定されている。
時刻.
時刻の表現は、24時制だけが規定されている。12時制のオプションは存在しない。
表記は hh":"mm":"ss の形式である。hh は時で 00 から 24 の値をとる。mm は分で 00 から 59 の値をとる。ss は秒で 00 から 59 及び閏秒に 60 の値をとる。ss, mm":"ss の部分は省略可能で hh":"mm, hh の形式も使用可能である。
最も下の要素（秒だけに限らない。）では小数値を用いることができる。小数点にはコンマ ( , ) （フランス式）が推奨されているが、ピリオド ( . ) （イギリス式）を用いることもできる。日本ではピリオド（ . ）を用いることがほとんである。
日の変わり目の表し方は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）での時刻をそのまま示すことができる。
UTCより先に進んでいる時間帯の場合はプラス(+)、UTCより後に遅れている時間帯の場合はマイナス(−)として、時刻の後ろに ±"hh":"mm, ±"hhmm, ±"hh" のいずれかを添えることにより、表記の時刻がその時間帯（タイムゾーン）でのローカル時刻であることを示す。
継続時間.
継続時間は、ある期間中に含まれる時間の合計を定義し、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は、各日付と時間の要素の指定子であり、他の文字には置き換えない。
たとえば、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、または、拡張フォーマットとしては、が使用できる。しかし、日付と時間のそれぞれの値は、モジュロ演算における法を超えることは許されない（たとえば、月の値として13、時間の値として25などは許されない）。
標準では、継続時間は、次のセクションで説明する時間の期間の一部として記述されているものの、継続時間のフォーマットは時間の期間とは独立したものとして広く使用されている。
期間、時間間隔.
期間（time interval）は"開始日時/終了日時"で表記される。それぞれの日時は上述の日付あるいはそれに付属した時刻によって表記され、その2つの時刻の間に半角スラッシュ ("/") を挿入する。
なお期間の明示にあたっては、開始日時と終了日時で年あるいは年と月が同一である場合、それを省略することができる。
繰り返し間隔.
インターバルは "R[n]/" を先頭に付ける。nは繰り返し回数を意味する。[n]を省略した場合、または-1を指定すると無制限の繰り返しとみなされる。0の場合繰り返されないことを意味する。
例えば、"P1Y2M10DT2H30M" という継続時間を5回繰り返す場合、"R5/2008-03-01T13:00:00Z/P1Y2M10DT2H30M"になる。
国家規格による拡張.
日本 (JIS X 0301).
日本産業規格 JIS X 0301（旧JIS C 6262）があり、ISO 8601:2000 の翻訳が（英語題はISO 8601に同じ）に収められている。
規格では、「元号による日付」（和暦）が規定されている。
元号は「明」「大」「昭」「平」「令」または「M」「T」「S」「H」「R」であり、これらをメタ文字 "N" で表す。元治、慶応など明治よりも前の元号についての規定はない。
日付は、基本形式「YY.MM.DD」または拡張形式「"N"YY.MM.DD」で表される（元号での年も「YY」である）。このとき、年月日は2桁とし、1桁目のゼロは省略できない。年月日の区切り記号はハイフンではなくピリオドである（西暦年月日の場合は、2019-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).
 CNS 7648「資料元及交換格式・資訊交換・日期及時間的表示法」では、民国紀元が「R.O.C.」で表される。
例:
プログラミング言語での実装.
ほとんどのプログラミング言語で、日付および時刻を扱う方法は標準ライブラリに入っているか、別のライブラリがある。例えば、Java の場合は java.time パッケージで扱い、.NET Framework はラウンドトリップ書式指定子で、JavaScript は Date.toISOString() などで、Python は datetime.isoformat() などで扱える。