3

2つの日付の間に何年経過したかを計算する必要があります。私のコードは、非常に特定の日付を除いて、正常に機能します。

dateEnd以下のコードは、との両方で同じ年の差を生成するはずですdateEnd1が、等しくはありません。2003年から2004年に年を変えると、同じになります。もし私がその年を去るが、3月から2月に変わるならば、それは再び等しくなるでしょう。

うるう年と関係があると思いますが、なぜかわかりません。特に、その期間にはうるう年が4年あったため、年の誤算は1日だけ離れた日付で発生します。

どちらの場合も年差は12になると思いますが、最初のケースではdateEnd変数を使用して13になります。

var dateStart = '2003,03,11';
var dateEnd = '2016,03,10';
var dateEnd1 = '2016,03,09';

var difference = (new Date(dateEnd)).getTime() - (new Date(dateStart)).getTime();
difference = (new Date(difference)).getFullYear() - 1970;
alert('Between ' + dateStart + ' and ' + dateEnd + ' elapsed ' + difference + ' years.');
difference = (new Date(dateEnd1)).getTime() - (new Date(dateStart)).getTime();
difference = (new Date(difference)).getFullYear() - 1970;
alert('Between ' + dateStart + ' and ' + dateEnd1 + ' elapsed ' + difference + ' years.');

これがjsfiddleのコードです。コメントの1人は、彼のjsfiddleで問題を再現することができました!

これが私が得る変数の値です

dateStart time: 1047337200000
dateEnd time: 1457564400000
dateEnd1 time: 1457478000000
Time difference for the first case: 410227200000
Between 2003,03,11 and 2016,03,10 elapsed 13 years.
Time difference for the second case: 410140800000
Between 2003,03,11 and 2016,03,09 elapsed 12 years.
4

2 に答える 2

2

これはロケールとは関係ありません。また、2016年の1月または2月を除く他の月に日付を変更すると、12/13の結果が得られます。その理由は、2016年はうるう年であり、2003年はうるう年ではないからです。

これは、日付の差を日付として計算することは信頼できないことを証明しています。年の差を計算するには、両方の日付の年の部分を使用する必要があります。また、月の部分を比較します。終了月が開始月より前の場合は1年を減算し、開始月と終了月が同じ場合は月の日も比較します。必要に応じて、時間、分、秒、ミリ秒を含めることもできます。

于 2013-03-22T22:03:47.620 に答える
2

再現できる/できない違いはロケールではなく、タイムゾーンです。私(カリフォルニア)の場合、上記の値は次のようになります。

alert(new Date(410140800000)); // "Thu Dec 30 1982 16:00:00 GMT-0800 (Pacific Standard Time)"
alert(new Date(410227200000)); // "Fri Dec 31 1982 16:00:00 GMT-0800 (Pacific Standard Time)"

私がGMTまたはその東にいる場合、2番目の日付は「1983年1月1日土曜日...」になり、年数が異なります。うるう年の数が差の日数に影響を与えているため、うるう年が発生している可能性があります。

2005/2018を使用しても同じことがわかると思いましたが、Arjanが指摘しているように、それはそれほど単純ではなく、うるう年を伴います。

于 2013-03-22T22:17:15.970 に答える