RFC 2822 日付フォーマット
メールヘッダーやHTTPで使用されるRFC 2822日付フォーマットを解説。構文、タイムゾーン略語、パースと生成方法を詳しく説明します。
Format
Mon, 15 Jan 2024 09:30:00 +0000
詳細な説明
RFC 2822は、元々メールメッセージのヘッダー用に定められた日時フォーマットを定義しています。そのフォーマットは人間が読みやすく、曜日を含みます:ddd, DD MMM YYYY HH:mm:ss ±HHMM。メールのDate:ヘッダー、一部のHTTPヘッダー、RSSフィードで見かけます。
フォーマットの分解:
Mon, 15 Jan 2024 09:30:00 +0000
│ │ │ │ │ │
│ │ │ │ │ └── タイムゾーンオフセット(コロンなし)
│ │ │ │ └── 時刻(24時間制)
│ │ │ └── 年(4桁)
│ │ └── 月(3文字の略語)
│ └── 日
└── 曜日(3文字の略語)
ISO 8601との主な違い:
| 特徴 | ISO 8601 | RFC 2822 |
|---|---|---|
| 月の形式 | 数値 (01-12) | 略称 (Jan-Dec) |
| 曜日 | なし | あり(省略可能) |
| 区切り文字 | 日付/時刻間にT | 日付/時刻間にスペース |
| タイムゾーン | Z または ±HH:MM | ±HHMM(コロンなし) |
| ソート可能 | はい | いいえ(月名がソートを妨げる) |
コードでのRFC 2822生成:
// JavaScript
new Date().toUTCString()
// "Mon, 15 Jan 2024 09:30:00 GMT"
# Python
from email.utils import formatdate
formatdate(timeval=None, localtime=False, usegmt=True)
よくある落とし穴:
レガシーシステムでは、数値オフセットの代わりに「EST」や「PST」などのタイムゾーン略語を使用する場合があります。これらの略語は曖昧です(CSTは米国中部標準時、中国標準時、キューバ標準時のいずれにもなりえます)。曖昧さのないパースのためには、常に+0000の数値オフセット形式を使用すべきです。
どちらを使うべきか: APIやデータストレージにはISO 8601を推奨します。RFC 2822はプロトコル仕様で要求される場合(SMTP、特定のHTTPヘッダー、RSS)に使用してください。選択肢がある場合、ISO 8601がデフォルトとしてより優れています。自然にソートでき、曖昧さが少ないためです。
ユースケース
メール送信サービスを構築する際、Dateヘッダーは必ずRFC 2822形式でフォーマットする必要があります。そうでないと、メールクライアントがメッセージを不審としてフラグ付けしたり、送信時刻が誤って表示される可能性があります。