ISO 8601 の日時フォーマット解説
ISO 8601 は日付と時刻を文字列として表す国際標準です。その正準形 2024-03-15T14:30:00Z は曖昧でなく、ソート可能で、あらゆる現代の言語とデータベースでサポートされています。本ガイドではフォーマットをコンポーネントごとに、ほとんどの API が実際に使う RFC 3339 サブセット、新しい RFC 9557 タイムゾーン拡張、そして期間・間隔・週日付のバリアントを取り上げます。
ISO 8601 とは
ISO 8601 は国際標準化機構による日付と時刻の表現です。現行版(ISO 8601-1:2019 / -2:2019)はコンパクトで順序付けられ、言語に依存しないテキスト形式を定義します。その狙いは曖昧さの排除です。03/04/2024 のような日付は米国では 3 月 4 日、欧州の多くでは 4 月 3 日ですが、2024-03-04 はどこでも同じ意味です。この標準は、ほとんどのインターネットプロトコルが実際に使うプロファイルである RFC 3339 の基礎でもあります。
- 常に 年-月-日 の順:2024-03-15(03/15/2024 や 15/03/2024 ではない)
- 時刻部分はリテラルの T かスペースで区切る:2024-03-15T14:30:00
- タイムゾーンは明示:UTC には Z、オフセットには ±HH:MM
- テキストとしてソート可能 — 辞書順が時系列順と一致する
正準の日時フォーマット
最も一般的な形は 2024-03-15T14:30:00.123Z のようになります。各コンポーネントは固定幅でゼロ埋めされており、それがこの形式をソート可能で曖昧でないものにしています。
| コンポーネント | 例 | 意味 |
|---|---|---|
| YYYY | 2024 | 4 桁の年 |
| MM | 03 | 2 桁の月(01〜12) |
| DD | 15 | 2 桁の日(01〜31) |
| T | T | 日付/時刻の区切り(RFC 3339 ではスペースも可) |
| hh:mm:ss | 14:30:00 | 24 時間制、ゼロ埋め |
| .fff | .123 | 任意の小数秒(ISO 8601 では任意精度) |
| Z または ±hh:mm | Z | タイムゾーン指定子(Z = UTC = +00:00) |
タイムゾーン指定子
ISO 8601 のタイムゾーンは UTC からのオフセットとしてエンコードされ、EST や CET のようなゾーン略称(曖昧)では決して表しません。文字列は、一部の地域が使う 30 分や 45 分のオフセットを含め、正確な UTC の瞬間を再構築するのに十分な情報を持ちます。
| 指定子 | UTC からのオフセット | 例となるゾーン |
|---|---|---|
| Z | +00:00 | UTC(「Zulu」時間) |
| +09:00 | 9 時間進み | 日本標準時 |
| -05:00 | 5 時間遅れ | 米国東部標準時 |
| +05:30 | 5.5 時間進み | インド標準時 |
| +05:45 | 5.75 時間進み | ネパール標準時 |
| (なし) | 未指定 | ローカル時刻 — 曖昧。API では避ける |
ISO 8601 vs RFC 3339
RFC 3339 は ISO 8601 のプロファイルで、より制限的でパースが容易です。ほとんどのインターネットプロトコル(JSON API、HTTP、IETF 仕様)は具体的に RFC 3339 を対象とするため、API が「ISO 8601」と言うとき、ほぼ常に RFC 3339 サブセットを意味します。違いは小さいですが、ある文字列がパースできるかを左右します。
| 項目 | ISO 8601 | RFC 3339 |
|---|---|---|
| 日付/時刻の区切り | T、または基本形式では省略可 | T または単一のスペース(必須) |
| タイムゾーンオフセット | 任意 | 必須 |
| 小数秒 | 任意精度 | 可。パーサーで上限あり |
| 基本形式(ハイフンなし) | 20240315T143000Z 可 | 不可 |
| 週日付/序数日付 | 可 | 不可 |
| 典型的な用途 | アーカイブ、表計算、交換 | JSON API、HTTP、IETF 仕様 |
RFC 9557:タイムゾーンと Temporal 拡張
+01:00 のような単なるオフセットは瞬間は伝えてもタイムゾーンは伝えません——さらにオフセットは夏時間で変わるため、同じゾーンでも冬は +01:00、夏は +02:00 です。RFC 9557(2024 年)は Internet Extended Date/Time Format(IXDTF)でこのギャップを埋めます。2024-03-15T14:30:00+01:00[Europe/Paris] のように、角括弧で IANA ゾーン名を付け加えるのです。これは JavaScript の Temporal API が読み書きする文字列形式なので、Temporal の普及とともに目にする機会が増えます。後方互換も保たれます——角括弧の接尾辞を取り除けば、通常の RFC 3339 タイムスタンプになります。
- オフセットのみ:2024-03-15T14:30:00+01:00 — 瞬間は分かるがゾーンは分からない
- IXDTF(RFC 9557):2024-03-15T14:30:00+01:00[Europe/Paris] — 瞬間とゾーン
- 後方互換:角括弧のタグは RFC 3339 パーサーが無視できる
バリアント:期間、間隔、週日付
ISO 8601 は瞬間以上を扱います。いくつかのバリアントはスケジューリング、アーカイブ、レポートのシステムで定期的に登場します。
- 期間:P3Y6M4DT12H30M5S = 3 年 6 か月 4 日 12 時間 30 分 5 秒
- 間隔:2024-01-01/2024-02-01、または 2024-01-01/P1M(開始 + 期間)
- 序数日付:2024-075 = 2024 年の第 75 日(3 月 15 日)
- 週日付:2024-W11-5 = 2024 年 ISO 第 11 週の金曜日
- 繰り返し間隔:R3/2024-01-01/P1D = 1 月 1 日から始まる 1 日間隔 3 回
コードでの ISO 8601
主要な言語はどれも RFC 3339 サブセットを標準で生成・パースできます。最も安全な習慣は、Z 付きの UTC で出力し、瞬間としてパースし戻すことで、タイムゾーン変換は表示層に任せます。
- JavaScript 出力:new Date().toISOString() // '2024-03-15T14:30:00.123Z'
- JavaScript パース:new Date('2024-03-15T14:30:00Z') // RFC 3339 サブセット
- Python 出力:datetime.now(timezone.utc).isoformat()
- Python パース:datetime.fromisoformat('2024-03-15T14:30:00+00:00') // 3.11+ で完全な ISO
- ほとんどのデータベース(Postgres、SQLite)は ISO 8601 timestamptz を直接受け付けて返す
ISO 8601 のよくある間違い
厳密な標準があっても、パースや出力のコードは同じいくつかの間違いをします。
- タイムゾーンの省略:Z もオフセットもない 2024-03-15T14:30:00 は曖昧
- "+00:00" の代わりに "+0000" を使う——受け付けるパーサーもあるが RFC 3339 は不可
- 文字でない T を使う(Unicode のそっくり文字はコピペで崩れる)
- 12 時間制の AM/PM を ISO 8601 に混ぜる——常に 24 時間制
- 小数秒を丸めずに切り捨てる——精度を 1 つ決めて守る
- ISO 8601 をロケール依存として扱う——そうではない。形式は言語に関わらず固定
関連リファレンス
FAQ
- "2024-03-15 14:30:00Z" は有効な ISO 8601 ですか?
- はい——日付と時刻の間のスペースは ISO 8601(および RFC 3339)で許可されています。曖昧さのない機械的なパースには T 形式が好まれます。
- 末尾の Z は何を意味しますか?
- Z は UTC(オフセット +00:00)を意味します。文字 Z を表す NATO/航空のフォネティックである「Zulu time」の略です。
- JavaScript で ISO 8601 をパースするには?
- new Date("2024-03-15T14:30:00Z") は標準の RFC 3339 サブセットで機能します。より広い ISO 8601 サポートには date-fns や Temporal API のようなライブラリを使います。
- ISO 8601 は RFC 3339 と同じですか?
- いいえ——RFC 3339 は厳密なサブセットです。すべての RFC 3339 タイムスタンプは有効な ISO 8601 ですが、すべての ISO 8601 タイムスタンプが有効な RFC 3339 とは限りません。
- RFC 9557 とは何ですか?
- RFC 9557(2024 年)は RFC 3339 を Internet Extended Date/Time Format(IXDTF)で拡張します。角括弧で IANA ゾーン名を付け加え(例:2024-03-15T14:30:00+01:00[Europe/Paris])、JavaScript の Temporal API が使う文字列形式の基盤となっています。
- T 区切りは必須ですか?
- 厳密な ISO 8601 では基本形式で T を省略できますが、RFC 3339 は T または単一のスペースを必須とします。機械的なパースには常に T を含めてください。
- ISO 8601 と ISO 8601-2 の違いは何ですか?
- ISO 8601-1 は基本的な日付と時刻の表現を扱います。ISO 8601-2(2019 年の拡張)は不確実な日付、修飾値、複雑な間隔などの新しい構文を追加します。