日付の表記に関するノート
日付の表記方法は、文化的な背景の違い、また用途の違いによって様々なフォーマットがあります。多くの場合、特に断り無く使っても問題なく正しい日時を伝えることができますが、文脈や利用者の環境によっては、意外な落とし穴にはまることもあります。誤解なく、かつ効率的に処理しやすい日時表記方法としては、2001-08-02T10:35Z
というスタイルの、ISO/W3Cフォーマットがあります。
文化と日付表記
よく見かける日付の表記法として、01/08/02という具合に2桁の年月日をスラッシュで区切ってつないだものがあります。これはなかなか曲者で、地域によって意味が全く違うのです。
- 日本では……2001年8月2日
- 英国では……2002年8月1日
- 米国では……2002年1月8日
こうした違いを認識していないと、使用する文脈によっては思わぬ誤解を生じる危険があります。明らかに日本人(あるいはイギリスの人、アメリカの人)しか読まないという文書でなければ、この表記法を用いるのはあまり賢明とはいえません。
年を4桁にすると、日本式と欧米式は区別できるはずですが、ヨーロッパとアメリカはやはり区別が不可能です。また、音声ブラウザ(例:IBMホームページリーダー)は、01/08/02という記述があると、
ぜろはちぶんのぜろいち、ぜろに
という読み方をしてしまい、日付であることが理解し難くなるという問題点もあります。
日時表記の国際標準とW3Cノート
こういう混乱を避け、日時を一意に表記できるようにするために、国際標準化機構(ISO)においてISO 8601:1988[ISO8601](翻訳版がJIS X 0301-1992)が定められました。ただ、この標準はかなり多くのバリエーションを定義している上、西暦年の上2桁の省略を認めているため、あまり使い勝手が良くありません。そこで、IS0 8601のサブセットとして、日時の表記方法を限定し、よりシンプルにしたものがW3Cからノート[W3CDTF]として公開されました。
W3Cの日時フォーマット
W3Cのノートで示されている表記法はW3C-DTF(もしくはW3CDTF)と呼ばれ[*注]、次の6通りのフォーマットがあります。
- (1) 年のみ
- YYYY(例:
2001
) - (2) 年月
- YYYY-MM(例:
2001-08
) - (3) 年月日
- YYYY-MM-DD(例:
2001-08-02
) - (4) 年月日および時分
- YYYY-MM-DDThh:mmTZD(例:
2001-08-02T10:45+09:00
) - (5) 年月日および時分秒
- YYYY-MM-DDThh:mm:ssTZD(例:
2001-08-02T10:45:23+09:00
) - (6) 年月日および時分秒および小数部分
- YYYY-MM-DDThh:mm:ss.sTZD(例:
2001-08-02T10:45:23.5+09:00
)
上記のフォーマットで変数として表記しているアルファベットは、一般に使われるようにYMDがそれぞれ年月日、hmsがそれぞれ時分秒を表す数字を意味します。小数点以下の秒を表記するばあい、桁数に制限はありません。TZDはタイムゾーンを示す部分で、UTC(協定世界時=グリニッジ標準時)との時差を+09:00
などとして示すか、UTCで表記していることを示す Z
を記述します。また、年月日と時分秒はアルファベットの T
で区切ります。
この表記法は曖昧さなく、かつコンパクトに日時を示すことができ、またソフトウェアでの処理も簡単であるというメリットがあります。[HTML4]では、%Datetime;(ins/del要素タイプのdatetime属性)は、このW3C-DTFの(5)の形式を用いるようセクション6.11で示しています(WebSiteDesignに掲載した記事の「修正日時の書式」を参照)。
W3C-DTF(3)型の日付をホームページリーダーで読み上げると、
にぜろぜろいち の ぜろはち の ぜろいち
という具合です。完全ではないものの、分数として読まれるよりは日付を理解しやすのではないでしょうか。
〔*注〕 W3C-DTFという略称はW3Cノートに記されているものではありませんが、Dublin Core Qualifiers[DCQ]で日付スキームの一つとしてW3C-DTFが定義され、その要素タイプ名がW3CDTF、ラベルがW3C-DTFとなっています。SCHEMAS RegistryにはW3CDTFが登録されています。
XML Schemaの日時データ型
XML Schemaのデータ型[XSDTYPE]では、W3C-DTFの年月日時分秒をフルに表すフォーマット(5)(6)がdateTime型として定義されています。ただし、W3C-DTFではタイムゾーンが必須なのに対し、dateTime型ではオプション扱いです。
その他の型として、年月日だけを示す YYYY-MM-DD
(ISO8601:1988やXML Schemaでは年を CCYY
と表記)はdate型、年だけを示す YYYY
はgYear型、年月を示す YYYY-MM
はgYearMonth型、また時分秒のみを示す hh:mm:ss
はtime型など、細かいデータ型が定義されています。9999年を超えた場合は、年の左に桁を追加して良いということも定められています(ISO 8601も2000年の第2版では年の拡張を認めています)。
タイムスタンプのインターネット標準
インターネットの電子メールなどのプロトコルで日時のタイムスタンプを示すためのフォーマットは、次のセクションで示すように伝統的な書式がありますが、今後登場する新しいプロトコルはISO 8601に基づいた新しいフォーマットを用いることが[RFC3339]で示されました。この規格では、XML SchemaのdateTime型と同様に、W3C-DTFの(5)およびオプションとして(6)の書式が標準として採用されています。また、読みやすさなどの観点から、日付フォーマットと時刻フォーマットを空白で連結する 2001-08-02 10:45:23+09:00
という記述も認められます。
そのほか広く用いられる日時の書式
ピリオド区切りによる日付
日本ではしばしばピリオドで年月日を区切った「2001.08.02」という書式が使われます。このピリオド区切りの日付は、ドイツやロシアなどヨーロッパの一部では"02.08.2001" (DD.MM.YYYY
)という形式でよく使われるようです(DB2や一部のSQLではこの日付書式をEUR=欧州標準規格と呼んでいます)。一方、スイスやノルウェイでは *(デンマークでは、手紙などの日付に MM.DD.YYYY
という書式が以前使われたりしたようで、/
区切りと同様の混乱を招く可能性はありますMM/DD-YYYY
という混合書式が使われるという話も見かけました。国によってはDD-MM-YYYYというのもあるらしいです)。
〔*注〕 スイスやノルウェイの日付表記は、FreeDOSの付属文書の国コードに関する説明で拾った情報ですが、裏付けがとれないのでいったん削除します。
また、この書式をホームページリーダーは次のように読み上げます。
にせんいち てん ぜろはち、ぜろに
ピリオド区切り書式は、ISO 8601には定められていませんが、JIS X 0301では元号を表記する書式として追加されています。
(例)H13.08.02
YYYY.MM.DD
の形式は、情報交換用としてはスタンダードとはいえないので、できればW3C-DTFを用いる方が応用範囲が広がるでしょう。
電子メール、HTTPヘッダなどの日時表記
電子メールやHTTPヘッダでは、曜日を持ち、月を3文字のアルファベットで示す日付表記が用いられます。[RFC2822]で定められているのは、次のような書式です。
(例)Thu, 02 Aug 2001 10:45:23 +0900
HTTP/1.1[RFC2616]では、歴史的な経緯により多少異なる書式も認められていますが、RFC 2822のフォーマットに従うのが一般的です。
UNIXのdateコマンドや、Javascriptなどでは、C言語のctime()関数のフォーマットに準じて、一般に次のような出力がデフォルトになっています。
(例)Thu Aug 2 10:45:23 JST 2001
これらの書式は、長い間用いられているので、それなりに処理ルーチンも整備されてはいますが、プログラムに扱いやすいフォーマットというわけではありません。データとして処理する可能性のある日付は、やはりW3C-DTFで記述する方が汎用性が高いと思います。今後登場するインターネットプロトコルは、上に記したようにW3C-DTFスタイルでタイムスタンプを記述することになる見込みです。
継続期間の表記
特定の日付でなく、複数の日にまたがっていることを表記したい場合もあります。フェスティバルが8月2日〜9月10日であるというようなケースで、共通して理解可能なフォーマットを使いたいことがあるかも知れません。
ISO 8601の期間表記
期間表記については、W3Cのフォーマットには含まれていませんが、ISO 8601には次のようにスラッシュ( /
)を用いる表記方法が定められています。
(例)2001-08-02/2001-09-10
ISO 8601に従えば、この期間表記の始点と終点で、共通する上位要素は省略できます。この場合、2001年は共通なので次のように表記できます。
(例)2001-08-02/09-10
期間が8月2日から8月10日までならば、次のように表記します。
(例)2001-08-02/10
あまりポピュラーとは言えない表記である上、音声読み上げではやはり分数のようになってしまうという難点もありますが、試してみる価値はあるでしょう。
Dublin Coreの期間表記
メタデータを記述する標準語彙のひとつであるDublin Coreでは、期間を表記するための語彙とその表現方法も定めています[DCPERIOD]。たとえば、フェスティバルの期間をXMLで記述するには次のようにします。
(例)
<Period name="Festival"> <start>2001-08-02</start> <end>2001-09-10</end> </Period>
日時のフォーマットはW3C-DTFがデフォルトですが、異なる表記方法を使う場合は、start
, end
要素にscheme
属性でそのフォーマットを指定することになっています。
読みやすさと処理しやすさのバランス
ここまで述べてきた様々な日付フォーマットは、人間にとって読みやすく誤解がないことと、ソフトウェアで処理しやすいことのバランスを考慮して書式が定められています。機械処理が目的なら、ISO 8601の基本形式(区切り記号を用いるのは拡張形式)による次のような表記が効率が良いでしょう。
(例)20010802T104523+0900
人間が読むことを第一に考える場合は、素直に「2001年8月2日」と書くのが一番分かりやすいわけです(特に音声合成を考えると、きちんと年月日という単位を加えるのが恐らくベスト)。あるいは、国際化を意識するなら August 2, 2001 など。人間は文脈を判断できますから、明らかな場合は年表記を略すのもありです(明らかでないのに省略すると、あとから読んだときに時期が不明という、別のよくある落とし穴にはまります)。
データの汎用性という観点からは、例えばMicrosoft Excelにデータを貼り付ける場合、「2001-08-02」「2001/08/02」「2001年8月2日」は日付データとして扱われますが、「2001.08.02」は文字列として扱われる(日本の場合)、といった点も考慮すると良さそうです。
文書内に記述する日付にどの書式を採用するのが望ましいかは、その日付を主として人間が読むのか、ソフトウェアの処理も念頭に置くのかによって異なってきます。本文で地の文として出てくる日付は「2001年8月2日」型がわかりやすいでしょうし、統計などの表を示すならW3C-DTFを用いておくと再利用がしやすくなるでしょう(本文中でも、適切なクラス付けでメタデータを抽出できるようにする場合には、W3C-DTFのほうが良さそう)。日記の日付や文書の更新日を記述する場合は、簡単には決めにくい要素がありますが、相互運用性の高い情報発信のためには、これらもW3C-DTFを用いて書くのが望ましいのかもしれません。
参照文献
- [ISO8601]
- ISO 8601:1988(E) Data elements and interchange formats - Information interchange - Representatoin of dates and times, , ISO/TC 154, International Standard
- 2000年12月に改訂版ISO 8601:2000(E)が発行されています。年を5桁以上に拡張できる規定、閏秒の扱い、繰り返し期間の表記などが加わりました。また年の表記がCCYYからYYYYに変更されるなど、細かい修正が加えられています。
- [W3CDTF]
- Date and Time Formats, , W3C Note ,
- <http://www.w3.org/TR/NOTE-datetime>
- [DCQ]
- Dublin Core Qualifiers, , DCMI Recommendation ,
- <http://dublincore.org/documents/dcmes-qualifiers/>
- [HTML4]
- HTML 4.01 Specification, , W3C Recommendation ,
- <http://www.w3.org/TR/html4>
- [XSDTYPE]
- XML Schema Part 2: Datatypes, , W3C Recommendation ,
- <http://www.w3.org/TR/xmlschema-2/>
- [RFC3339]
- Date and Time on the Internet: Timestamps, , Internet Engineering Task Force ,
- <http://www.ietf.org/rfc/rfc3339.txt>
- [RFC2616]
- Hypertext Transfer Protocol -- HTTP/1.1, , Internet Engineering Task Force ,
- <http://www.ietf.org/rfc/rfc2616.txt>
- [RFC2822]
- Internet Message Format, , Internet Engineering Task Force ,
- <http://www.ietf.org/rfc/rfc2822.txt>
- [DCPERIOD]
- DCMI Period Encoding Scheme, , DCMI Recommendation ,
- <http://dublincore.org/documents/dcmi-period/>