ISO 8601
ISO 8601は、日付と時刻の表記に関するISOの国際規格である。この規格の主眼は、日付と時刻の記述順序が国や文化によってまちまちである[注 1][1]ものを、大→小の順序(ビッグエンディアン big-endian)を貫徹して、日付・時刻の記述順序をただ一種類に標準化していることにある[2]。また、時刻表現は24時制のみに限定している。
- 2017年7月17日を、2017-07-17(拡張形式)もしくは20170717(基本形式)と表記する[3]。
- 同日の時刻として 17時07分17.77秒 を併せて表記する場合は、2017-07-17T17:07:17.77(拡張形式)もしくは20170717T170717.77(基本形式)と表記する。すなわちT記号で区切った後に時刻を続ける。
上記以外に、日の番号、暦週の番号、タイムゾーン、継続時間、期間などの記述方法についても規定している。
日本では、これに準拠して日本産業規格JIS X0301「情報交換のためのデータ要素及び交換形式ー日付及び時刻の表記」が定められている。JISにおいては、元号(明治~令和)による年の規定を追加している[4]。
経緯[編集]
規格のこれまでの経緯は次の通りである。
- ISO 2014:1976[5] Writing of calendar dates in all-numeric form
- ISO 8601:1988[6] Data elements and interchange formats — Information interchange — Representation of dates and times
- ISO 8601:2000[7] 同上
- ISO 8601:2004[8] 同上
- ISO 8601-1:2019 (Date and time -- Representations for information interchange -- Part 1: Basic rules)[9] および ISO 8601-2:2019 (Date and time -- Representations for information interchange -- Part 2: Extensions)[10] の2分冊(2019年2月発行。2021年時点の最新版)
基本形式と拡張形式[編集]
ISO 8601形式の時刻表記例[11] | |
---|---|
基本形式 | 20230113T221818+0900 |
拡張形式 | 2023-01-13T22:18:18+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 となる。
年月日と時分秒の区切りの符号は、従来、「/」(2021/10/27)や「.」(2021.10.27)が使われることがあったが、日付については、「-」のみ、時刻については、「:」のみを使わなければならない。ただし、日本における元号を用いる場合は、JIS X0301に基づき、令04.10.27 または R04.10.27 のようにピリオドを用いる(#国家標準による拡張)。
日付と時刻の組合せにおいて基本形式と拡張形式との混在は許されず、どちらかに統一されていなければならない。
プログラミング言語の多くが拡張形式を処理する作りとなっている。基本形式にも対応するものは必ずしも多くない。
起点[編集]
グレゴリオ暦による年月日は、パリにおけるメートル条約の調印年月日を1875年5月20日とすることで定義されている[12]。
曜日は、2000年1月1日を土曜日とすることで定義されている[13]。
月日、時分秒の起点の指定は特にない。
日付[編集]
ISO 8601 では日付の指定の仕方に、年と月と日を指定する方法、年と年内の日の番号を指定する方法、年と週と曜日を指定する方法の3つがある(下記に詳説)。
年の表記(0000年~9999年)[編集]
日付の表記にはグレゴリオ暦を用い、これはグレゴリオ暦が導入された1582年10月15日以前にも適用される(「先発グレゴリオ暦」も参照)。ただし、0000年から1582年の範囲は、事前に通信の送信側と受信側との間での合意がある場合にのみ使うことができる[14]。一般(たとえばJavaライブラリ)には1582年以前の日付表現はユリウス暦と解釈されるが、ISO 8601 にはそのような措置はない。そのため、それらの日付表現をこのISO準拠にするにはグレゴリオ暦への換算が必要である。
年は(基本形式の場合でも拡張形式の場合でも)4桁の数字で表記される。
年の表記(0000年より前、9999年より後)[編集]
- 0000年より前または9999年より後の年を表記する場合には、事前に通信の送信側と受信側との間での合意が必要である[15]。例えば、先頭に正負の符号(+あるいは-)を付して任意の桁数の数字を追加することができるという合意などである(任意の桁数の追加であるため年の桁数は5桁以上(正負の符号を含めると6桁以上)になりうる。)。なお、拡張表記の場合、事前の合意次第では+019332が有効であっても+000299は無効という場合がありうる。(西暦10000年問題も参照)
- 年の表記は 0001 が西暦1年を表し、0000 は紀元前1年、-0001 は紀元前2年、-0002 は紀元前3年である(天文学的紀年法と同じ)。これは通常の西暦紀元には西暦0年が存在しないためである(ちなみに0世紀も存在しない)。
月の表記[編集]
月の表記は 01 から 12 の値を取り、それぞれ1月から12月を表す。
年と月と日[編集]
YYYY-MM-DD | または | YYYYMMDD |
YYYY-MM | (YYYYMM は不可 ) | |
YYYY |
YYYYMMDD(基本形式)あるいは YYYY-MM-DD(拡張形式) のいずれかで表記される。「年」が最初に来ていることを明らかにするため、また、視認性を良くするため、この拡張表記が頻用されている。
- 例:
- 20000401(基本形式)および 2000-04-01 (拡張形式)はいずれも2000年4月1日を表す。
YYYY-MM のみで-DD を省くことも、 YYYY のみで MMDD(-MM-DD) を省くことも可能であり、その場合、前者は年月のみを、後者は年のみを表す。ただし、YYYYMM というような‐(ハイフン)無しの数字6桁のみの表記は認められていない。
- 例:
年と年内の日の番号[編集]
YYYY-DDD と表記する。 DDD は、年内の日の番号である。1月1日は 001 と表記し、12月31日は平年では 365 、閏年では 366 になる。
- 例:
- 2004-092 (2004092)
- 2004年の第92日目、すなわち4月1日を表す。
- 2004-092 (2004092)
年と週と曜日[編集]
この記法では、年が、通常の場合の年とは異なる年になる場合がある。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日を表す。
- 2004-W14-4 (2004W144)
この記法では、ある年における「最初の木曜日を含む週が、その年の第1週である。」と規定されている。
- 「その年の第1週は、1月4日を含む週である。」としても、基準としては等しい。
- 具体例を以下に示す。年初において以下の曜日に該当する場合、その日は新年第1週の日としてではなく、前年最終週の日として扱う。
- 同様に、年末において以下の曜日に該当する場合、その日はその年の最終週の日としてではなく、次の年の第1週の日として扱う。
時刻[編集]
時刻の表現は、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 と等価。
- 11:30:30,5 (113030,5)
日の変わり目の表し方は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)
- 2004-04-01T12:00Z (20040401T1200Z)
- UTC以外のタイムゾーン(時間帯)
UTCより先に進んでいる時間帯の場合はプラス(+)、UTCより後に遅れている時間帯の場合はマイナス(-)として、時刻の後ろに ±hh:mm, ±hhmm, ±hh のいずれかを添えることにより、表記の時刻がその時間帯(タイムゾーン)でのローカル時刻であることを示す。
- 例:
- 2004-04-01T12:00+09:00 (20040401T1200+0900)
- 2004年4月1日12時00分(JST)
- 2004-04-01T12:00+09:00 (20040401T1200+0900)
継続時間[編集]
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は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などは許されない)[16]。
標準では、継続時間は、次のセクションで説明する時間の期間の一部として記述されているものの、継続時間のフォーマットは時間の期間とは独立したものとして広く使用されている[17][18]。
期間,時間間隔[編集]
期間(time interval[19])は"開始日時/終了日時"で表記される。それぞれの日時は上述の日付あるいはそれに付属した時刻によって表記され、その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/2005-07-01
なお期間の明示にあたっては、開始日時と終了日時で年あるいは年と月が同一である場合、それを省略することができる。
- 年が同一の場合の例:
- 2004-04-01/07-01
- 2004年の4月1日から7月1日まで
- 2004-04-01/07-01
- 年と月が同一の場合の例:
- 2004-04-01/15
- 2004年4月の1日から15日まで
- 2004-04-01/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」[20]、あるいはメタ文字「N」で表される。元治、慶応など明治よりも前の元号についての規定はない。
日付は、基本形式「YY.MM.DD」または拡張形式「NYY.MM.DD」で表される(元号での年も「YY」である)。年月日のセパレータはハイフンではなくピリオドである(西暦年月日の場合は、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 パッケージにて[21]、.NET Framework はラウンドトリップ書式指定子にて[22]、JavaScript は Date.toISOString() などで[23]、Python は datetime.isoformat() など[24]で扱える。
脚注[編集]
注釈[編集]
- ^ 西暦年を末尾の2桁で表す慣習もあるので、11/09/12(または 11.09.12)の表記は、2011-09-12(日本など)、2012-09-11(英国など)、2012-11-09(米国など)の3つの年月日の可能性がある。
出典[編集]
- ^ en:Date format by country
- ^ date-time format by region, visualised CLDR 38.1/ISO 8601
- ^ したがってこれら以外の17/07/2017(17 July 2017)や 07/17/2017(July 17, 2017)の表記は認めない。
- ^ JIS X0301:2002 p.25、附属書2(参考)JISと対応する国際規格との対比表、kikakurui.com
- ^ 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 - Data elements and interchange formats -- Information interchange -- Representation of dates and times
- ^ ISO 8601:2004 - Data elements and interchange formats -- Information interchange -- Representation of dates and times
- ^ 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
- ^ 日本標準時によるページ生成時刻
- ^ [1] 3.2 Time scales、The Gregorian calendar has a reference point that assigns 20 May 1875 to the calendar day that the “Convention du Mètre” was signed in Paris.、p.14
- ^ [2] 3.2.2 The week calendar、The reference point of the time scale assigns Saturday to 1 January 2000.、p.15
- ^ [3] p.20、Values in the range [0000] through [1582] shall only be used by mutual agreement of the partners in information interchange.
- ^ [4] 3.5 Expansion p.19
- ^ ISO 8601:2004 section 4.4.3.3 Alternative format
- ^ “Java 8 Class Duration”. Java Platform Standard Edition 8. Oracle. 2017年10月7日閲覧。
- ^ “Amazon Alexa Duration”. Amazon Developer. Amazon.com. 2017年10月7日閲覧。
- ^ 3.1.1.6 time interval. part of the time axis (3.1.1.4) limited by two instants (3.1.1.3) and, unless otherwise stated, the limiting instants themselves ISO 8601-1:2019
- ^ 日付及び時刻の表記を規定する JIS に「令和」を追加 経済産業省 産業技術環境局 国際電気標準課、2019年5月20日
- ^ java.time (Java SE 11 & JDK 11 )
- ^ ラウンドトリップ ("O"、"o") 書式指定子 - 標準の日時書式指定文字列 | Microsoft Docs
- ^ Date.prototype.toISOString() - JavaScript | MDN
- ^ datetime --- 基本的な日付型および時間型 — Python 3 ドキュメント
関連項目[編集]
外部リンク[編集]
- 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 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規格についての極めて詳細な記述・解説がなされている。日時表現の厳密な実装を実現するためには参考となる。