1

私はこれに対する答えを見つけるためにかなり多くを探してきましたが、見つけることができませんでした。

2 つの日付があり、それらの間の日数を計算したい

しかし、私はまた、終了日を数えたいと思っています。

例 :

  • 私と妻は [1 月 20 日] から [1 月 26 日] までホテルに行くので、合計 7 日間です。

私が見つけた唯一のコードは次のとおりです。

 Math.round((b - a) / ( 1000 * 60 * 60 * 24)) +1 

どこ :

var a= new Date (y,0,20);
var b= new Date (y,0,26);

また、ネストされたループを作成して、150 年以内のすべての月をテストしましたが、正常に動作します

var y = 1970;
var m = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
for(var i = 0; i < 150; i++)
{
    for(var j = 0; j < 12; j++)
    {
        var a = new Date(y + i, m[j], 20);
        var b = new Date(y + i, m[j], 26);
        var days = Math.round((b - a) / (1000 * 60 * 60 * 24)) + 1;
        if(days != 7) console.log(i + y); //tell me if result is unexpected.
    }
}
console.log('-FINISH-' + new Date().getTime())

では、どこに問題があるのでしょうか?

ここでのような数学関数がどのように機能するのかわかりませんround

ここではミリ秒について話していますが、ラウンド動作が正しい結果をもたらす場所がわかりません。

(ps - ceil と floor を忘れてください。ここでは役に立たず、一貫性のない結果が得られます)、b値に 1 日を追加して、 ceil || を使用することも試みました。床に落ちたが成功しなかった

ここにコードがあります

4

4 に答える 4

1

理由がわかりました!:)(例:2035年)

Date {Sun Mar 25 2035 00:00:00 GMT+0100 (CET)} 
Date {Mon Mar 26 2035 00:00:00 GMT+0200 (CEST)}

GMTタイムズを見てください。1つはGMT+0100(CET)で、もう1つはGMT + 0200(CEST)です。

ラウンドなしで常に結果を取得するには、UTCを使用する必要があります。

var a = Date.UTC(y + i, m[j], 25);
var b = Date.UTC(y + i, m[j], 26);
var days = (b - a) / (1000 * 60 * 60 * 24);

このバグを見つけるためにコードを少し変更しました:

var y = 1970;
var m = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
for(var i = 0; i < 150; i++)
{
    for(var j = 0; j < 12; j++)
    {
        var a = new Date(y + i, m[j], 25);
        var b = new Date(y + i, m[j], 26);
        var days = (b - a);
        if(days != 86400000) console.log(i + y, days); //tell me if result is unexpected.
    }
}


1983 90000000
1984 82800000
1988 90000000
...

これはすでにここで議論されています:

http://www.webdeveloper.com/forum/archive/index.php/t-5195.html

于 2012-08-20T06:57:26.273 に答える
1

丸めが機能している理由は、丸一日しか使用していないためです。myDate.getTime()1970-01-01 からのミリ秒数が得られます。常にパーツを に設定するため、new Date(y,m,d)常に日付を割り当てる場合、日付の比較では常に 86400000 の倍数が得られます。これが除数です。ここでの丸めは、ほとんどの場合不要です。time00:00:00.000

上記のようにすべての日付を作成している場合、四捨五入が行われるのは、 date の夏時間オフセットが date の夏時間オフセットbと異なる場合のみですaround1 時間を超えることはめったにないため、これらの不一致は処理されます。

あなたのスクリプトから、1970 年 10 月は (CEST で) 問題があります。

var a = new Date(1970, 9, 20);
var b = new Date(1970, 9, 26);

(b - a) / (1000 * 60 * 60 * 24) // 6.041666666666667

四捨五入するか、UTC 日付を使用することで、これを回避できます。

var a = new Date(Date.UTC(1970, 9, 20));
var b = new Date(Date.UTC(1970, 9, 26));

(b - a) / (1000 * 60 * 60 * 24) // 6
于 2012-08-20T06:50:19.337 に答える
1

これがあなたの答えです:

http://www.direct.gov.uk/en/Nl1/Newsroom/DG_185398

基本的に、3 月 25 日の時間は 24 時間ではなく 23 時間です。10 月 28 日の時間は 25 時間です。そのため、丸めはうまく機能しますが、床/天井は機能しません。

また、ご覧のとおり、DST の日付は毎年変更されます (同じ記事で確認できます)。他の年には DST が別の日付に適用されるため、テスト結果は正常に表示されます。

于 2012-08-20T06:54:15.257 に答える
-1

以前の投稿ですでに回答されているように:

var days = Math.floor(enddate.getTime()-startdate.getTime())/(24*60*60*1000);
于 2012-08-20T06:41:00.603 に答える