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形式でフォーマットする必要があります。そうでないと、メールクライアントがメッセージを不審としてフラグ付けしたり、送信時刻が誤って表示される可能性があります。

Try It — Timestamp Converter

フルツールを開く