読者です 読者をやめる 読者になる 読者になる

サマータイムにやられた

Tech JavaScript

タイトルのまんまです。
ちょっと前に作ったCompact Calendar Creatorというツールが、本家Compact Calendarのサイトで紹介されて、Deliciousでホットエントリになりました。
やったー!と喜んでいたら、ぽろぽろと不具合報告が。
英語でメールが書かれていて、「カレンダーを作ったら11月2日が2回表示されるぞ」的なことが書いてあるわけです。
(勘の良い方ならここでオチが分かるので、以下読み飛ばしてください)
11月2日だけ2回出るって、JavaScriptでfor文で1日(24*60*60*1000msec)ずつ加算していって日にちをインクリメントしているのに、そんな変なことあるわけないじゃんと。メールにかかれている条件を何度試しても再現しないわけですよ。なにかの間違いだろ、とか思っていたら、同じような報告がいくつか寄せられてきました。
共通しているのが、どのメールも2008/11/2が2回表示されるということ。
もしかして、うるう秒とか?なんて色々考えて、調べたりもしたのですが、これといった原因も見つからず。
海外だから発生しているのかと思い、PCの環境設定でタイムゾーンを米国にしたら、見事再現しました。
原因はサマータイムでした。
つまり、getDate()で日付を取得していたために 、サマータイムの切り替え時期である11/2が、2008/11/2 00:00:00 と 2008/11/2 23:00:00 の2回表示されたわけです。
タイムゾーンに依存しない日付の計算が必要ということで、getDate()をgetUTCDate()にすることで回避しました。