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值上加一天,并使用 ceil || 地板但没有成功

这是代码

4

4 回答 4

1

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

如果您按照上面指定的方式创建所有日期,则唯一的时间舍入会起作用,即 date 的夏令时偏移量与 date 的夏令时偏移量b不同around将处理这些差异,因为它们很少超过一个小时。

从您的脚本来看,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
于 2012-08-20T06:50:19.337 回答
1

这是你的答案:

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

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

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

于 2012-08-20T06:54:15.257 回答
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 Times 一个是 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

于 2012-08-20T06:57:26.273 回答
-1

正如在上一篇文章中已经回答的那样:

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