超キレやすいプログラマのブログ -2ページ目

超キレやすいプログラマのブログ

キレてキレてキレまくる

主にAndroidのプログラムについて書くと言っていた本ブログだが、俺の仕事があっちこっちツマミ食いするスタイルなので今はAndroid使ってない。
なので、すっかりプログラムならなんでもアリの内容になってきた。



っつうことで、今回は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で統一してくれんかね。