我一直在寻找相当多的答案,但却找不到答案。
我有两个约会, 我想在它们之间计算天数
但我也希望计算结束日。
示例:
我发现的唯一代码是:
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 ||但没有成功
答案 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);