メインコンテンツまでスキップ

Appendix A. ISO 8601 Collected ABNF

この情報は1988年版のISO 8601に基づいています。2000年の改訂版では若干の変更がある可能性があります。

説明

ISO 8601は、定義する日付と時刻の形式に対して正式な文法を指定していません。以下は、ISO 8601から正式な文法を作成する試みです。これは情報提供のみを目的としており、エラーが含まれている可能性があります。ISO 8601が権威ある参照であり続けます。

曖昧さと解釈

ISO 8601の曖昧さのため、いくつかの解釈が必要であったことに注意してください:

  1. 基本形式と拡張形式の混合: ISO 8601は、基本形式と拡張形式の混合が許可されているかどうか明確ではありません。この文法は混合を許可します。

  2. 24時間: ISO 8601は、分と秒が0の場合にのみ時刻24が許可されるかどうか明確ではありません。この文法は、任意のコンテキストで時刻24が許可されると仮定します。

  3. 日付制限: date-mdayに関するセクション5.7の制限が適用されます。

  4. "T"区切り文字: ISO 8601は、特定の状況下で"T"を省略できることを指定しています。この文法は曖昧さを避けるために"T"を必須とします。

  5. 小数点: ISO 8601は(セクション5.3.1.3で)小数部分が1未満の場合、"0"で始まらなければならないことを要求しています。ISO 8601の付録B.2は"0"で始まらない小数部分の例を示しています。この文法はセクション5.3.1.3が正しく、付録B.2が誤りであると仮定します。

完全なISO 8601 ABNF文法

date-century    = 2DIGIT  ; 00-99
date-decade = DIGIT ; 0-9
date-subdecade = DIGIT ; 0-9
date-year = date-decade date-subdecade
date-fullyear = date-century date-year
date-month = 2DIGIT ; 01-12
date-wday = DIGIT ; 1-7 ; 1 is Monday, 7 is Sunday
date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31
date-yday = 3DIGIT ; 001-365, 001-366
date-week = 2DIGIT ; 01-52, 01-53

datepart-fullyear = [date-century] date-year ["-"]
datepart-ptyear = "-" [date-subdecade ["-"]]
datepart-wkyear = datepart-fullyear / datepart-ptyear

dateopt-century = "-" / date-century
dateopt-fullyear = "-" / datepart-fullyear
dateopt-year = "-" / (date-year ["-"])
dateopt-month = "-" / (date-month ["-"])
dateopt-week = "-" / (date-week ["-"])

datespec-full = datepart-fullyear date-month ["-"] date-mday
datespec-year = date-century / dateopt-century date-year
datespec-month = "-" dateopt-year date-month [["-"] date-mday]
datespec-mday = "--" dateopt-month date-mday
datespec-week = datepart-wkyear "W"
(date-week / dateopt-week date-wday)
datespec-wday = "---" date-wday
datespec-yday = dateopt-fullyear date-yday

date = datespec-full
/ datespec-year
/ datespec-month
/ datespec-mday
/ datespec-week
/ datespec-wday
/ datespec-yday

time-hour = 2DIGIT ; 00-24
time-minute = 2DIGIT ; 00-59
time-second = 2DIGIT ; 00-58, 00-59, 00-60
time-fraction = ("," / ".") 1*DIGIT
time-numoffset = ("+" / "-") time-hour [[":"] time-minute]
time-zone = "Z" / time-numoffset

timeopt-hour = "-" / (time-hour [":"])
timeopt-minute = "-" / (time-minute [":"])

timespec-hour = time-hour [[":"] time-minute [[":"] time-second]]
timespec-minute = timeopt-hour time-minute [[":"] time-second]
timespec-second = "-" timeopt-minute time-second
timespec-base = timespec-hour / timespec-minute / timespec-second

time = timespec-base [time-fraction] [time-zone]

iso-date-time = date "T" time

RFC 3339 vs 完全なISO 8601

RFC 3339はISO 8601の制限されたサブセットであり、完全な実装ではありません:

機能ISO 8601RFC 3339
基本形式 (20020715)✅ サポート❌ 非サポート
拡張形式 (2002-07-15)✅ サポート✅ サポート
週日付 (2002-W29-1)✅ サポート❌ 非サポート
序数日付 (2002-196)✅ サポート❌ 非サポート
部分日付 (2002-07)✅ サポート❌ 非サポート
24時間 (2002-07-16T24:00:00)✅ サポート❌ 非サポート
タイムゾーン"Z"✅ サポート✅ サポート
数値タイムゾーンオフセット✅ サポート✅ サポート(必須)
小数秒✅ サポート✅ サポート

RFC 3339簡略化の理由

RFC 3339が簡略化されたサブセットを選択した理由:

  1. 相互運用性: 実装の差異を減らす
  2. 明確性: 曖昧さを回避
  3. 完全性: 完全な日付時刻情報を要求
  4. 簡潔性: 実装とテストが容易

注記: 完全なISO 8601機能(週日付など)が必要な場合は、ISO 8601標準を直接参照してください。RFC 3339は、インターネットプロトコルで最も一般的なタイムスタンプのユースケースに焦点を当てています。