2

私は現在、ある種の 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 は安全に使用でき、すべての主要なブラウザで一様に実装されていますか?

4

2 に答える 2

7

MDNから:

指定したパラメータが想定範囲外の場合、setDate はそれに応じて Date オブジェクトの日付情報を更新しようとします。たとえば、dayValue に 0 を使用すると、日付は前月の最終日に設定されます。

考えてみれば論理的です。setDate(1)日付を月の最初に設定します。前月の最終日、つまり今月の初日の前日を取得するには、引数から 1 を引いて を取得します0。2 日 ( ) を引く1 - 2と、最終日から 2 番目 ( -1) になります。

[..]コードサンプルはインターネットのがらくたに広がっていますか?

はい。これは、少なくとも 90% の確率で当てはまります。

于 2013-01-02T11:44:20.353 に答える
3

MDNでは次のように述べています。

指定したパラメータが想定範囲外の場合、setDate はそれに応じて Date オブジェクトの日付情報を更新しようとします。たとえば、dayValue に 0 を使用すると、日付は前月の最終日に設定されます。

したがって、一貫した結果が得られます。

 1 - Jan 1
 0 - Dec 31
-1 - Dec 30
-2 - Dec 29

編集: PHP のstrtotime()関数などの単なる相対値と考えると、直感に反するように見えるかもしれません。

strtotime('-1 day');

そうではありません;-)

于 2013-01-02T11:46:40.207 に答える