なので、すっかりプログラムならなんでもアリの内容になってきた。
っつうことで、今回はJavaScriptのDate型について気づいたことを。
早速だがソース。
<script>
alert(new Date("2013/10/24").toString()); //・・・(1)
alert(new Date("2013-10-24").toString()); //・・・(2)
</script>俺は最初、この2つの結果は同じだと思ってた。
しかし実際には、
(1)・・・「Thu Oct 24 00:00:00 UTC+0900 2013」
(2)・・・「Thu Oct 24 09:00:00 UTC+0900 2013」
と異なる結果に。
これは、
(1)はnew時に「日本時間 (JST)の2013年10月24日 0時0分0秒」と解釈してDateオブジェクトを作成している。
(2)はnew時に「協定世界時 (UTC) の2013年10月24日 0時0分0秒」と解釈してDateオブジェクトを作成している。
toString()メソッドはローカルタイムの日付文字列を出力するので、(2)の方はJSTとUTCの時差である9時間を加味した出力になった。
という理屈である。
IE10、Chrome、FireFoxいずれも同様の結果であった。
どうしてハイフンだとUTCとして扱うんだ?
Wikipediaを読むと、ISOの書式は
(a)「YYYYMMDD」
(b)「YYYY-MM-DD」
※年月日のみ。時分秒に関しては省略。
の2種類のようだ。
さらにInternet Explorer 日付と時刻文字列 (JavaScript)を見ると、JavaScriptでサポートしているのは(b)のみ。(実際(a)を実行してみるとInvalid Dateになった。)
つまり、日付の区切りにハイフンを使っているとISOとみなしているようだ。
さらにそのサイトには興味深い一文が。
ISO 形式は、タイム ゾーン名をサポートしていません。 Z 位置を使用すると、UTC 時刻からのオフセットを指定できます。 Z 位置に値を指定しない場合は、UTC 時刻が使用されます。
つまり、ISO形式で記載され、かつZ指定が省略されているのでUTCとして扱ったということか。
・・・っつうことは、Z指定を省略しなければローカルタイムに出来るってこと?
<script>
alert(new Date("2013-10-24+09:00").toString());
</script>どれどれ、実行っと・・・
ピコーン

Motherfucker!!!
どうやらZ指定を入れるときはT(時間)を省略できないようだ。(なんでやねん・・・省略しても+か-が出たら以降がタイムゾーン指定だってわかるやん・・・・いや、ハイフンは日付の区切りで使ってるから見分けつかないのか・・・・ISO8601決めるときにもうちょっとなんとかならんかったんか?)
<script>
alert(new Date("2013-10-24T00:00:00+09:00").toString());
</script>
多国向けシステムを作るときのDateオブジェクトの扱いは面倒くさいわー。
いっそのこと、ローカルタイムを廃止して世界中をUTCで統一してくれんかね。