日付形式

日付形式

[1] 日付を文字(数字)列で表現する方法には、古来様々な 方法が採られてきました。しかしその試みはそれぞれ 独立したものであったため、多くの場合互換性がありません。 例えば、 01/02/03 は、地域により2001年2月3日, 2003年1月2日, 2003年2月1日のように複数の解釈があり得ます。

人が書いて人が解釈していた頃は、当然混乱はあったにしろ、 文脈によりある程度使い分け・識別していました。 しかし機械が日付を扱うようになると、それに伴い表現方法は (技術的制約などで) 更に増加し、混乱は決定的なものとなりました。

電子メイルの日付形式

電子メイルの部分に記述する日付の形式です。 現在では頭は基本的に機械が処理する部分との認識・実装が 一般的ですが、かつては人が読み書きするのが当然でしたから、 斜線を使う方式での解釈の多義性が問題視されたのです。

RFC 561の日付形式

  • 24 JUL 1973 1527-PDT
  • 7/27/1973 1527-PDT

RFC 724の日付形式

  • 26 August 1976 1429-EDT
  • Wednesday, 8/31/76 1251-Z

RFC 561 の形式の上位互換のようです。 斜線を使う形式は地域により解釈が異なり得るので非推奨とされてます。

RFC 733の日付形式

  • 26 Aug 76 1429 EDT

RFC 724 の英月名形式とほぼ同じ物です。

RFC 822の日付形式

  • 26 Aug 76 14:29:01 EDT

RFC 733 の形式と似ていますが、時間(hour)と分・秒の 区切りの ":" が必須となりました。

なぜか年号が2桁でなければならないように退化しています。

電子ニュース・メッセージでのRFC 1036の日付形式にそのまま 採用されました。

RFC 1123 の日付形式

  • Fri, 15 Mar 2002 16:53 +0900

RFC 822 の形式の小改訂で、4桁の西暦年号が認められ、 推奨されました。また、時間帯は数値表現が推奨されています。

MIMEHTTPの日付形式でもほぼそのまま採用されています。 (RFC 3339の日付形式登場以前の) Internet 標準の日付形式と考えられていました。

RFC 2822の日付形式 (822形式の subset)

RFC 822の日付形式 (RFC 1123 で改訂) と実質的に同じです。 但し新しいメッセイジに使われる形式として、より厳格な書式が 定義されています。

RFC 1505の日付形式

RFC 822の日付形式の秒の後に、1秒に満たない秒数(ってへんな いいかただけど。) が6桁分まで書ける様に拡張したものです。 RFC 1505 が普及しなかったので、この形式も普及しませんでした。

電子ニュースの日付形式

USENET では元々 ARPANET電子メイルとは 違った形式を使っていましたが、電子ニュースのメッセージの形式自体 が RFC 822 とほとんど同じ物になったので、日付形式もそうなりました。

RFC 850の日付形式RFC 1036の日付形式 (RFC 822の日付形式と同じ) →usefor-articleのDate:欄

ただし、電子ニュースの記事では RFC 822 とは異なり、途中での FWS や comment の自由な挿入は許されていません。 当初からほぼ RFC 2822 の obs でない構文相当でした。

HTTPの日付形式

HTTP/1.0 以降は RFC 822 と同じ様なメッセージ形式を使っていますから、 RFC 822の日付形式 (をやや限定したもの) を標準としていますが、標準化が遅れている間に自分の好きな形式を送る実装が多くなりすぎたために、 RFC 850の日付形式 (旧) や asctime形式も理解出来なければならず、 更にそれ以外の形式も頑張って解釈できるようにすることになっています。

HTMLの日付形式

HTML は歴史的な理由により様々な日付形式を併用しています。 datetime 属性datetime フォーム制御子では、 ISO 8601の日付形式プロファイルを使っています。 lastModified DOM属性では ECMAScriptの日付形式に近いものを使っています。

XMLの日付形式

XML は仕様として日付形式を特に規定しているわけではありませんが、 XML 応用の中には XML Schemaの日付形式を用いているものも多々あります。

Atomの日付形式のように、「RFC 3339の日付形式かつ XML Schemaの日付形式」 のようなよくわからない定義を採用しているものもあります。

RSSRFC 822の日付形式プロファイルを定義しています。

ISO 8601の日付形式

ISO 8601の日付形式は、その名の通り ISO 8601 で規定された形式ですが、 ISO 8601 そのものは具体的な形式を定めず、様々な日付要素を定義して、これを組み合わせて柔軟に実際の形式を確定できるようになっています。

RFC 3339の日付形式

RFC 3339 は、 Internet の新しい標準時刻表現形式を規定しています。 これは ISO 8601 のプロファイルであり、 W3C HTML4 などで採用されている日付形式とほぼ同じものです。

XML Schemaの日付形式

XML Schema 第2部では dateTime など複数の日時に関連したデータ型を定義していますが、 その中には RFC 3339 の日付形式に似た (同じではない) 日付形式など、 ISO 8601の日付形式プロファイルにあたるものが含まれています。

言語仕様・ライブラリの日付形式

asctime形式

ANSI C の asctime() の日付形式です。 Cperl などでは非常に手軽に扱うことが出来るので、よく使われます。このためHTTPの日付形式にも含まれています。

Un*x time

The epoch (1970年1月1日0時0分0秒 (GMT)) からの経過秒数を使うのが Un*x時間形式です。 Un*x で動作するプログラムを中心に内部処理形式・保存形式として非常に良く使われています。

[11] 閏秒が扱えないという問題がありますが、これまであまり意識されてきませんでした。

ECMAScriptDate 物体

ECMAScript は The Epoch からのミリ秒の数を Date 物体で使っています。 DOMDOMTimeStamp データ型もそれに倣っています。 Date 物体には toGMTString など日付文字列に変換するメソッドが定義されています。

Visual BasicDate

Microsoft 社の言語環境である Visual Basic で日付や時刻を扱う型である Date 型の実体は浮動小数点型で、整数部で日付, 小数部で時刻を表します。

人間が読むことを主な目的とした日付形式

2ch の日付形式

  • [13] (旧) 2001/02/09(金) 22:49
  • [14] (新) 02/12/18 22:56

[48] 最近100分の1秒単位で入るようになりました。 (名無しさん [sage] 2005-12-31 12:40:02 +00:00)

[49] >>48 (VIPでは。) (名無しさん [sage])

[50] 2006年3月31日の次は3月32日になりました。 (名無しさん 2006-03-31 16:13:50 +00:00)

[51] >>50 その翌日は4月2日でしたが、VIPなど一部の板では3月33日になりましたw (名無しさん 2006-04-01 16:15:27 +00:00)

[52] 佐賀暦2006年,2006/10/21(佐賀) 03:11:20.28 @ VIP (佐賀県記念)

(名無しさん 2006-10-21 01:19:45 +00:00)

[53] VIP では2007/02/13(火)の次は2007/02/15(水)になりました。

(名無しさん 2007-02-14 13:26:34 +00:00)

/. の日付形式

  • [15] Monday December 02, @10:38AM

各部について

年号

  • 2桁西暦年号の解釈
  • [30] 月: 情報交換用日付形式は一般に認めていませんが、1月、2月、3月を前年の13月、14月。15月にすると年度の関係で扱いがよくなることがあります。予定管理系ソフトウェア(謎)などでは採用の検討に値するでしょう。 (ツェラーの公式なんかもこの方法を使いますね。)
  • [31] 人が読む日付形式では、 (特に欧米で) 月名 (数字ではなく。) を使うのが好まれることがあります。例えば、 ISO 8601の日付形式2003-01-02 よりも RFC 2822の日付形式02 Jan 2003 の方が良いという人もいます。これは、欧米では >>1 に挙がっている解釈の多義性が大きな問題だからです。4桁年号と月の名前と日付の数字なら、解釈は明らかです。
  • [32] しかしながら、人が読む部分ではなく、機械が解釈するプロトコル要素では、形式をしっかり決めてしまえば曖昧性は無いので、どうでもいいといえばどうでもいいです。 (名前と番号の変換表の容易の手間の分だけ微妙に数字方式が楽でしょう。)
  • [33] また、 >>31 で人間に読ませるのが文章の途中ではなくソフトウェアの画面の一部なのであれば、地域化の時に月名を翻訳する (更に言えば、月名で表記する習慣が無い言語・地域もあるので、結局数字表記も選択可能である) 必要があります。 (locale)

[8] ほとんどの表記法は、午前午後の区別をせず、24時間制としています。

[9] 午前・午後を区別する場合は、真夜中と昼の0時が午前なのか午後なのか, 更に "0" 時なのか "12" 時なのかに注意する必要があります。

[12] >>9 区別しない場合においても、 "0" 時と "24" 時の扱いが問題になります。 "24:00" の存在を認めている形式もあれば、いない形式もあります。

  • [16] 夏時刻制を導入している地域では、同じ数字の時刻が標準時夏時刻で2回あったり、1度もなかったり、あるいは 24:00〜25:00 が存在したりします。夏時刻への移行の方法や時期は地域により異なりますし、同じ地域でも年により異なることが少なくないので注意が必要です。
  • [17] 夏時間とは関係ありませんが、起き続けている間を論理として、翌日の午前 n 時をその日の (n + 24) 時と呼ぶ人もいます。例えば翌日午前2時が26時となります。

[4] は、厳密には閏秒の挿入を考慮する必要があります。 しかし計算機やネットワークの分野ではそこまでの正確性が必要とはあまりなりませんから、閏秒を無視した規格や実装がかなり多いです。

[6] 日付の表記という面では、閏秒の削除はまず問題にはなりません。 (59秒が無くなるだけだから。) 閏秒の挿入は "60" という普通とりえない値が必要になりますから、問題になります。

[5] 最近の規格, 例えば ISO 8601の日付形式は閏秒を記述出来ます。

[7] 古い規格や実装では閏秒が2秒分挿入されて "61" 秒もありうるとしているものがありますが、実際にそうした例はありませんし、この説は間違いであることが後に分かりました。 ですから、新しい規格や実装は "61" 秒を考慮する必要はありません。

秒未満

[10] 秒未満 (秒の小数部) を扱える規格や実装はほとんどありませんでしたが、最近増えてきています。 例えば RFC 3339の日付形式は Internet 標準として秒未満の記述を可能にしています。 また GNU diff の出力には秒未満の欄があります。 HTMLの日付形式でも秒の小数部を記述できます。

  • [26] 但し書式として秒未満が扱えたとしても、それが正しいかどうかは別問題です。 (もちろん、秒以上の正確性の問題もありますが、秒未満はその細かさ故により精度に疑問があります。) 書式としての秒未満を扱えても、実際には内部で捨てている実装も少なくないでしょう。
  • [27] 秒未満を書式又は内部的にも扱える実装であっても、 RFC 3339 のように無限の精度を許したものをどう扱っているかは激しく実装依存と思われます。
  • [28] それに、 RFC 3339 の日付形式 (のようなもの) で秒未満が無い形式を、固定長として扱っている実装だって少なくは無い (XSLT スタイル・シートとか特に。) ですから、下手に秒未満を入れるとおかしくなる可能性も。

時間帯

RFC 2822, son-of-RFC 1036, usefor では数値形式を推奨。 HTTPでは文字列「GMT」固定。

非標準の時間帯文字列を使う実装がかなりあった。今は少ないと思う。 各地で観測されている時間帯を表す文字列の一覧参照。

数値形式に、注釈で文字列を添える (eg. +0900 (JST)) のが、 RFC 2822Received: 欄における推奨。だけど、そういうのを Date: 欄でやると意味の分からない足し算・引き算を やる訳の分からん実装 (Windows 95Microsoft Exchange らしい。) があるという罠。

「-0000」は時間帯不明を表すという慣習があって、RFC 2822の日付形式 で明文化された。 UTC との時差が整数分にならない時もこれを 使うといいらしい。(ほんとか? ; この話はどの仕様書にも 載ってない。; ていうか整数分にならない地域ってどこよ?)

RFC 3339 にこの話も載ってます。時差が整数分にならないのは、 過去にあったけど現在はないようです。 RFC 3339 は、そうした 時間帯は他の適当な(表現可能な)時間帯に直すように指示しています。 ("-00:00" にしろとまでは言ってない。)

  • [25] 過去のリベリアでは -00:44:30 を使っていたらしいです。

過去の日付

[47] DCMI Date Working Group <http://www.dublincore.org/groups/date/>

将来の日付

[18] 将来の日付の扱いも面倒です。将来行われうる暦法の変更を我々は知り得ないからです。 おそらく最も現実的な解は、

ことくらいでしょうか。

また、情報記録用の形式に通し時 (Un*xtime やユリウス日など) ではなく ISO 8601 のような人間可読形式を採用するのも良い考えかもしれません。 2003年1月1日の (365*100+閏日の数) 日後が2103年1月1日になる保証はありませんからね。

メモ