日付と時刻をTで結ぶ方式は普及していない

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

日付と時刻をTで結ぶ方式は普及していない

僕も ISO 8601 形式は大好きなんだけど、 YYYY-MM-DDTHH:MM:SS 形式は思いのほか通用しないので気をつけましょう。

日付と時刻の正しい表現方法 - Web屋のネタ帳

日付と時刻を両方表現したい場合は
2008-05-16T11:25:30+09:00
つまり日付と時刻をTでつなげる。

これが世界的スタンダードとしてISO8601とRFC3339に定められた日付と時刻の表現方法。有名どころの言語やらデータベースその他ミドルウェアはすべてこれに沿った表記を解釈し入出力できるようになっている。

JavaScript

とりあえず、JavaScriptではほとんど通用しません。

var timestamp = Date.parse('2008-05-16T11:25:30+09:00');
window.alert(timestamp + ' = ' + new Date(timestamp));

bookmarklet

↑のコードを各ブラウザで実行した結果が↓。

IE 6
NaN = NaN
Firefox 2
NaN = Invalid Date
Safari 3.1.1
NaN = Invalid Date
Opera 9.26
1210895340000 = Fri, 16 May 2008 08:49:00 GMT+0900

Operaの結果は謎。

RDBMS

確か、PostgreSQLでは TIMESTAMP型に YYYY-MM-DDTHH:MM:SS 形式は受け付けてもらえません。 [PostgreSQL 8.3.1文書 - 8.5. 日付/時刻データ型]

[コメント及び元記事の追記を受けて追記] PostgreSQLはちゃんと読んでくれるそうです。勘違いでした。

手元にあった MS Access 2003 でも駄目でした。

この二つは、 YYYY-MM-DD HH:MM:SS のように、日付と時刻をTではなくてスペースでつなげれば読んでくれるようです。

結論

ろくに検証もせずに結論付けるのも乱暴ですが、上記のように有名どころでもISO 8601の日付時刻形式 (というより、日付と時刻をTでつなぐ形式) に対応してくれていない言語やDBMSは多いです。僕は ISO 8691 Lover (その証拠に、このブログの日付欄はYYYY-MM-DD形式になっている) なのでいつもあちこちで試していますが、経験的にはあまり通用しません。

世界スタンダードだといっても通用しなければしょうがないですし、 YYYY-MM-DDTHH:MM:SS 形式自体が、数多い ISO 8601 形式の一つでしかないことを考えると、ごり押しはしないほうがいいでしょう。YYYY MM DD HH MM SSの順番と桁数だけ守って、区切り文字などは自由に対応できるようにしておくのが現実的な対応のような気がします。

下手に英語かぶれして 5/7/08 とかやられると殺意を覚えますが。

おまけ

ISOの規格は何かと便利なので、日頃から使う癖をつけておくと役に立ちます。

例えば、便利なところでは ISO 3166-1 (国名コード)ISO 639 (言語名コード)ISO 4217 (通貨名コード)など。ここらへんは何も考えずにそのまま使っちゃったほうが楽でしょう。

ISO 3166-2 (地域コード)を使えば、日本の都道府県を表すコードも手に入ったりします。 (例: 東京都 = JP-13)

おもしろいところでは、ISO 5218 (性別コード)なんてものもあります。社会調査などをやるときに使うと便利ですが、馬鹿正直に使うと↓のようなとても寛容な質問フォームになります。

性別
0. 不明    1. 男性    2. 女性    9. 該当なし

日頃頻繁に使うようなデータは、だいたいISOかJISで規格化されていたりするものなので、一度調べてみるとおもしろいかもしれません。

スポンサーサイト

関連記事

トラックバック URL

http://liosk.blog103.fc2.com/tb.php/109-b916ed0f

トラックバック

コメント

マニュアルの例文に書いてないからという理由で
「受け付けてもらえない」と書くのはどうかと。

testdb=> create table testtable (dt timestamp with time zone);
CREATE TABLE
testdb=> insert into testtable values ('2008-01-01T12:00:00+0900');
INSERT 0 1
testdb=> select * from testtable;
dt
------------------------
2008-01-01 12:00:00+09
(1 row)

testdb=>
  • 2008-05-08
  • by 誰か
  • id:-
おーーー

ちゃんと認識されるんですね!

記事のほうを訂正しておきました。
  • 2008-05-09
  • by LiosK
  • id:-

コメントの投稿

お名前
コメント
編集キー
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。