オルタナティブ・ブログ > まあまあ元気になる話 >

IT業界での少し気分がアップする出来事、心持ち役立つこと、ややイイ話

3日プラスすると3日過去の日付になる!?

»
4月からIT企業の新人研修を、通信教育で行っています。
JavaやWebプログラミングを3ヵ月間で学ぶ研修です。
e-learningと言わないのは、動画のストリーム配信とか学習管理システムとか、そういったものは使用していないからです。市販本やオリジナルのテキストでの自主学習形式、日々の管理はメールベースで行っています。
動画などでは、本人の理解度とは関係なく進んでしまうので、プログラミングなどの研修には不向きだと思っています。また、少人数向けの研修なので、管理システムなんて使うまでもありません。
用語を覚えたり、資格取得を目指すのではなく、プログラムを自力で組めるようになってもらうため、演習問題のソースコードを日々、メールで送ってもらい、それを添削する、ということが中心の研修です。

現在は、Javaが終わって、JavaScriptに入ってます。
先日、ビルドインオブジェクトを使用する章で、
「Dateオブジェクトで、3日後の日付を生成しようとして、+3したら、逆に、3日過去の日付になってしまいました」
との質問がありました。
ソースを見ると、
var now = new Date();
var day3 = new Date(now+3);
としていて、明らかに間違いなのですが、それにしても、何故3日過去になるのか。
ちなみに、nowが、
Sun May 12 2013 23:34:02 GMT+0900
であれば、day3は、
Thu May 09 2013 14:31:02 GMT+0900
となってしまいます。
now+3は、日付に+3されたわけではなく、文字列として結合され、
"Sun May 12 2013 23:34:02 GMT+09003"
と解釈され、さらに、09003の先頭の0が無視されてしまうようです。
day3 = new Date("Sun May 12 2013 23:34:02 GMT+9003");
でも同じ結果になりました。
なので、90時間03分と09時間00分との差、
81時間03分、つまり、3日と9時間03分だけ、
Sun May 12 2013 23:34:02 から引かれて、
Thu May 09 2013 14:31:02 となったのでしょう。

ちなみに、上記は、FireFoxでやったときの実行結果です。
Chromeだと、+3は無視され、nowと同じ日付、
IE9では、nowが、
Sun May 12 23:34:02UTC+0900 2013
day3は、
Tue May 12 23:34:02UTC+0900 20133
と表示されました。
20133年の5月12日は火曜日なのですね。

day3 = new Date("Sun May 12 2013 23:34:02 GMT+9003");
とすれば、どのブラウザも同じ結果になります。
Comment(0)