私は現在、ある種の JavaScript ベースのクライアント カレンダーを作成しており、いくつかの問題を観察しています。ネットのあちこちで、Date コンストラクターで日オーバーフローを使用しているコード サンプルを見つけることができます。
すなわち
// get the first day of the next month
var myDate = new Date(someDate.getFullYear(),someDate.getMonth(),32);
myDate.setDate(1);
この概念の一般的な考え方は、32 日の月がないため、コンストラクターは翌月の日付を作成するというものです。負のオーバーフローを含むコードサンプルも見ました:
すなわち
// get the last day of the previous month
var myDate = new Date(someDate.getFullYear(),someDate.getMonth(),1);
myDate.setDate(-1);
これは多くの場合うまくいくように見えますが、最終的に矛盾を見つけました:
// this prints "2012-12-30" expected was "2012-12-31"
var myDate = new Date(2013,0,1);
myDate.setDate(-1);
さらに調査した結果、new Date(2013,0,23) または new Date(2013,0,16) と setDate(-1) を組み合わせた日付はすべて「2012-12-31」になることが最終的に明らかになりました。最後に、-1 を使用すると 2 日が差し引かれるように見えることがわかりました (期待される結果を得るには、setDate(0) を使用する必要があります)。
これはブラウザの実装のバグですか、それともコード サンプルがインターネットのがらくたに広がっているのでしょうか??
さらに、正と負のオーバーフローを持つこの setDate は安全に使用でき、すべての主要なブラウザで一様に実装されていますか?