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

JavaScript - Calc days between 2 dates (Including end date)?

本文关键字:日期 包括 结束 两个 计算 JavaScript- 之间      更新时间:2023-09-26

我已经搜索了很多,但都找不到答案

我有两次约会,我想计算他们之间的天数

但我也希望最后一天能被计算在内。

示例:

  • 我和我妻子从【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这样的数学函数是怎么做到的。

我们在这里谈论的是毫秒,我看不出循环行为在哪里给我正确的结果。

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

这是代码

四舍五入之所以有效,是因为您只工作了一整天。CCD_ 3将产生自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

以下是您的答案:

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

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

此外,正如你所看到的,夏令时日期每年都会变化(你可以在同一篇文章中看到),这就是为什么每5-10年只有一次地板/沉箱测试失败的原因。在其他年份,夏令时适用于不同的日期,因此测试结果似乎是正常的。

我找到原因了!:)(例如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

如前一篇文章中所述:

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