【詳細②】日付と時刻の書き方:RFC 3339(ISO 8601の実用版)

書き方の国際規格:ISO 8601とRFC 3339

 日付と時刻の書き方には、国際規格のISO 8601があります。ところが、ISO 8601は、複数の表し方や一部だけ書く形をたくさん認めていて、複雑です。
 そこで、IETFのRFC 3339は、インターネットで使うためにISO 8601を絞り込んだ「プロファイル」を定めました。ISO 8601の拡張形式の部分集合で、ほとんどの項目と区切りの記号を必須にすることで、単純にしています [T1]。

 RFC 3339は、「日付と時刻の書き方は、インターネットで多くの混乱と、相互運用性の問題を起こしている」と冒頭で述べています [T1]。

基本の形

 2026-10-09T09:00:00+09:00

部分例意味
年-月-日2026-10-09年は4桁、月と日は2桁。
TT日付と時刻の区切り。
時:分:秒09:00:00時は00〜23、分と秒は00〜59(うるう秒のみ60)。
オフセット+09:00UTCとのずれ。
日本時間は+09:00。
UTCそのものならZ。

 RFC 3339の形式は、「年-月-日」の後に「T」、続いて「時:分:秒」、最後にUTCとのずれ(オフセット)を付けます。「T」は日付と時刻の区切りです [T1]。

 ルールは次のとおりです [T1]。

  • 年は必ず4桁:2桁の年は、あいまいさの原因になるため非推奨。インターネットのプロトコルは、4桁の年を生成しなければならない
  • 時は00〜23:ISO 8601では「24」も認められているが、混乱を減らすため、この形式では使わない
  • 秒の小数は任意:必要なら、「.52」のように、小数点以下を付けられる(たとえば「23:20:50.52」)
  • うるう秒は、秒に「60」と書く:うるう秒のときだけ60が現れる
  • 曜日は書かない:曜日は日付から計算でき、間違った曜日が混ざる可能性があるため

UTCとの「ずれ」:Zと+09:00

 時刻の最後に付くUTCとのずれを、「オフセット」と呼びます。次の書き方があります [T1]。

  • Z:UTCそのもの(オフセット00:00)。「ズールー」と読むことがある
  • +09:00 / -08:00:UTCとのずれ。計算は、「現地時刻 − UTC」。たとえば、+09:00は、UTCより9時間進んでいる

 RFC 3339の例では、「18:50:00-04:00」は、「22:50:00Z」と同じ瞬間です。
 「1996-12-19T16:39:57-08:00」は、「1996-12-20T00:39:57Z」と同じです [T1]。
 日本時間の例にすると、「2026-10-09T09:00:00+09:00」は、「2026-10-09T00:00:00Z」と同じ瞬間です。

注記:日本時間の例は、RFC 3339の計算規則(現地時刻からオフセットを引くとUTC)を
   日本に当てはめた私の例です。

「-00:00」という特別な書き方

 RFC 3339には、UTCは分かるが現地時間のずれが分からないときに使う、特別な書き方があります。
 「-00:00」と書きます。これは、「Z」や「+00:00」とは意味が違います。「Z」や「+00:00」は、UTCを基準にしたいという意味を含みます [T1]。

並べ替えができる:この形式の大きな利点

 RFC 3339の形式は、「年、月、日、時、分、秒」と、大きい単位から小さい単位へ並んでいます。そのため、時間帯(オフセット)が同じで小数点以下の桁数も同じなら、文字列として並べ替えるだけで、時間順に並びます [T1]。
 ログの検索や、ファイル名に日時を使うときにも便利です。

「10/11/1996」は使わない

 RFC 3339は、「10/11/1996」という書き方は国によって解釈が違うため、世界でのやり取りにはまったく向かないと明記しています [T1]。
 日本では、「2026/10/09」のように、年が先頭に来る書き方が一般的です。ただ、システムの間でやり取りする場合は、RFC 3339のような決まった形式を使うほうが誤解を防げます。

JSONには、日付型がない

 このシリーズの「データ形式」の記事でも見たとおり、JSONが扱える型は、文字列、数値、真偽値、null、オブジェクト、配列の6つだけです [T6]。日付や時刻の専用の型はありません。
 そのため、日付や時刻は文字列として書くことになります。このとき、RFC 3339の形式を使うことが一般的な選択肢です。

注記:「JSONの日付は、RFC 3339の形式で書くのが一般的」という点は、
   JSONに日付型がないこと(RFC 8259)と、RFC 3339がインターネットの
   標準的な書き方であることから整理した情報です。
   RFC 8259は、日付の書き方を定めていません。

RFC 3339が扱わないこと

 RFC 3339が対象にするのは、「ある瞬間」(タイムスタンプ)の表し方です。期間や、「毎週月曜の10時」のような繰り返しの予定は扱いません。
 また、すべての時刻には、UTCとの関係(オフセット)がはっきり示されている前提で、夏時間のような地域の時刻のルールには立ち入らない、と説明しています [T1]。

 RFC 3339は、2002年の文書です。その後、RFC 9557という文書で追加の情報(タイムゾーン名など)を付ける拡張が定められ、RFC 3339はこの文書によって更新されています [T1]。

注記:RFC 9557の中身は、今回読んでいません。
   RFC 3339のページに、更新した文書として記載されている、という点までを確認しています。

発注の前に確認したいこと

  • システム間でやり取りする日時は、RFC 3339(ISO 8601)形式か。年は4桁か
  • オフセット(+09:00やZ)を付けているか。付いていない日時を受け取ったときの扱いは決まっているか
  • CSVやExcelに出力する日時の形式は何か(このシリーズの「文字コード」「データ形式」の記事も参照)

注記:この3点は、RFC 3339の内容から整理した確認項目です。
   資料がこの形のチェックリストを示しているわけではありません。

参照元

[T1] IETF, RFC 3339: Date and Time on the Internet: Timestamps(2002年。RFC 9557により更新) — https://datatracker.ietf.org/doc/html/rfc3339

[T6] IETF, RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format — https://datatracker.ietf.org/doc/html/rfc8259

総集編に戻る

コメント

タイトルとURLをコピーしました