JavaScript - 2个日期之间的计算天数(包括结束日期)?

时间:2012-08-20 06:29:12

标签: javascript date

我一直在寻找相当多的答案,但却找不到答案。

我有两个约会, 我想在它们之间计算天数

但我也希望计算结束日。

示例:

  • 我和我的妻子从[20月1日]到[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这样的数学函数如何能够解决这个问题。

我们在这里谈论毫秒,我无法看到回合行为给我正确的结果。

(p.s。 - 忘记ceil和floor,他们在这里没有帮助并且结果不一致),我也尝试将一天添加到b值,并使用ceil ||但没有成功

here is the code

4 个答案:

答案 0 :(得分:1)

您的舍入工作的原因是因为您只使用了整整一天。 myDate.getTime()将产生自1970-01-01以来的毫秒数。如果您始终将日期指定为new Date(y,m,d),则time部分始终设置为00:00:00.000,因此日期比较将始终产生86400000的倍数,这是您的除数。这里的舍入大部分都是多余的。

如果您正在创建上述指定的所有日期,那么唯一的时间舍入就会发挥作用,即日期b的夏令时偏移与日期a的夏令时不同。 round将处理这些差异,因为它们很少超过一个小时。

从你的剧本来看,1970年10月是有问题的(在CEST中),因为10月20日是夏令时,10月26日不是。

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

答案 1 :(得分:1)

这是你的答案:

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

基本上,3月25日有23个小时而不是24个。而10月28日有25个小时。这就是为什么舍入效果很好而地板/ ceil没有。

另外,正如您所看到的,DST日期随着每年的变化而变化(您可以在同一篇文章中看到),这就是为什么每5到10年只有一次楼层/监狱测试失败。在其他年份,DST适用于不同的日期,因此测试结果似乎是正常的。

答案 2 :(得分: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时报一个是GMT + 0100(CET),一个是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

答案 3 :(得分:-1)

正如前一篇文章所述:

var days = Math.floor(enddate.getTime()-startdate.getTime())/(24*60*60*1000);