# ISO 8601

**ISO 8601**は、日付と時刻の表記に関するISOの国際規格。

日付と時刻の表記は国や文化によってまちまちである。特に年・月・日の順序はさまざまであり、例えば「11/09/12」は2011年09月12日（日本など）、2012年09月11日（英国など）、2012年11月09日（米国など）を表す可能性がある。また、正午の表記には、日本などでは「午後0:00」や「0:00 PM」などと表記する一方で、アメリカなどでは「12:00 PM」と表記する。

ISO 8601は日付と時刻を表す標準的な表記を定める。ISO 8601では日付・時刻の各要素の並べ方を「大→小」の順序に統一し、時刻表現を24時制のみに限定するため文化の違いによる曖昧さが無い。年月日の区切り記号は「-」（ハイフン）のみを用い「/」などを禁じる。

* 2022年9月4日を、**2022-09-04**（拡張形式）もしくは**20220904**（基本形式）と表記する。
* 2022年9月4日の時刻として 16時07分48.53秒 を併せて表記する場合は、**2022-09-04T16:07:48.53**（拡張形式）または**20220904T160748.53**（基本形式）と表記する。すなわち記号 **T** で区切った後に時刻を続ける。

上記以外に、日の番号、暦週の番号、タイムゾーン、継続時間、期間などの記述方法についても規定する。

日本では、**ISO 8601**に準拠して日本産業規格JIS X 0301「情報交換のためのデータ要素及び交換形式ー日付及び時刻の表記」が定められており、元号（明治～令和）による年の規定が追加されている。

## 経緯

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

* 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年時点の最新版）
* ISO 8601-1:2019/Amd 1:2022 (Date and time — Representations for information interchange — Part 1: Basic rules — Amendment 1: Technical corrections)

## 基本形式と拡張形式

| ISO 8601形式の時刻表記例 |
| --- |
| 基本形式 | 20260617T175339+0900 |
| 拡張形式 | 2026-06-17T17:53:39+09:00 |

基本形式（基本表記・標準表記）と拡張形式（拡張表記）の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年とすることによって定義されている。

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

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

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

## 日付

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

### 年の表記（0000年～9999年）

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

年は（基本形式の場合でも拡張形式の場合でも）4桁の数字で表記される。

### 年の表記（0000年より前、9999年より後）

* 0000年より前または9999年より後の年を表記する場合には、事前に通信の送信側と受信側との間での合意が必要である。例えば、先頭に正負の符号(**+**あるいは**−**)を付して任意の桁数の数字を追加することができるという合意などである。この場合、年の桁数は5桁以上になりうる。
* 事前の合意次第では、追加した符号と桁数を用いて9999年以前の日付を表すことを禁じることができる。例えば「**+009999**」を無効とすることもできる（西暦10000年問題も）
* 年の表記は**0000** が紀元前1年、**−0001** が紀元前2年、**−0002** は紀元前3年を表す。これは天文学的紀年法と同様である。

### 月の表記

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

### 年と月と日

|  |  |  |
| --- | --- | --- |
| YYYY-MM-DD | *または* | YYYYMMDD |
| YYYY-MM | (YYYYMM *は不可* ) |
| YYYY |  |

YYYYMMDD（基本形式）または YYYY-MM-DD（拡張形式） のいずれかで表記される。「年」が最初にあることを明らかにするため、また視認性を良くするために、この拡張表記がよく用いられている。

* 例:
	+ **20220904**（基本形式）および **2022-09-04**（拡張形式）は、いずれも2022年9月4日を表す。

YYYY-MM だけにして -DD を省くことも、YYYY だけにして MMDD(-MM-DD) を省くことも可能であり、その場合、前者は年月だけを、後者は年だけを表す。ただし、YYYYMM というようなハイフン（-）なしで数字6桁だけの表記は認められていない。

* 例:
	+ **2004-04**
	2004年4月
	+ **2004**
	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-*W*ww-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月1日日曜日
* 同様に、年末において以下の曜日に該当する場合、その日はその年の最終週の日としてではなく、**次の年の第1週の日**として扱う。
	+ 12月31日月曜日
	+ 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 の形式も使用可能である。

最も下の要素（秒だけに限らない。）では小数値を用いることができる。小数点にはコンマ ( **,** ) （フランス式）が推奨されているが、ピリオド ( **.** ) （イギリス式）を用いることもできる。日本のJIS X0301ではピリオドを用いている。

* 例（いずれも小数点はピリオド）:
	+ **18:30:09.57** (**183009.57**)
	18時30分09.57秒
	+ **18:30.25** (**1830.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** は日の終わりを表す（**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）

### タイムゾーン指定子

協定世界時（UTC）
時刻の後ろに **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）

## 継続時間

|  |
| --- |
| PnYnMnDTnHnMnS |
| PnW |
| P<date>T<time> |

継続時間は、ある期間中に含まれる時間の合計を定義し、**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**は継続時間の表現としては不正である。**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年4月1日から2005年7月1日まで
	+ **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年の4月1日から7月1日まで
* 年と月が同一の場合の例:
	+ **2004-04-01/15**
	2004年4月の1日から15日まで

### 繰り返し間隔

インターバルは "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 の翻訳がJIS X 0301:2002「情報交換のためのデータ要素及び交換形式 ― 日付及び時刻の表記」（日本産業標準調査会、経済産業省）（英語題はISO 8601に同じ）に収められている。

規格では、「元号による日付」（和暦）が規定されている。
元号は「明」「大」「昭」「平」「令」または「M」「T」「S」「H」「R」であり、これらをメタ文字 *N* で表す。元治、慶応など明治よりも前の元号についての規定はない。

日付は、基本形式「YY.MM.DD」または拡張形式「*N*YY.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)

中華民国国家標準 CNS 7648「資料元及交換格式・資訊交換・日期及時間的表示法」では、民国紀元が「R.O.C.」で表される。

例:

* R.O.C.93-04-01

## プログラミング言語での実装

ほとんどのプログラミング言語で、日付および時刻を扱う方法は標準ライブラリに入っているか、別のライブラリがある。例えば、Java の場合は java.time パッケージで扱い、.NET Framework はラウンドトリップ書式指定子で、JavaScript は Date.toISOString() などで、Python は datetime.isoformat() などで扱える。

* 日付
* 時刻
* 協定世界時（UTC）

* 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 （英語）
* ISO 8601-1:2019/Amd 1:2022 - Date and time — Representations for information interchange — Part 1: Basic rules — Amendment 1: Technical corrections
* ISO 8601 Date and time format （英語）
* RFC 3339 - 細かい差異は存在するが、ほぼ同じ IETF による規格。 （英語）
* Use international date format (ISO) - Quality Web Tips - The World Wide Web Consortium (W3C) （英語）
* JIS X 0301:2002「情報交換のためのデータ要素及び交換形式 ― 日付及び時刻の表記」（日本産業標準調査会、経済産業省）
* ISO 8601 suikawiki。 ISO 8601規格についての極めて詳細な記述・解説がなされている。日時表現の厳密な実装を実現するためには参考となる。