我已经搜索了很多,但都找不到答案
我有两次约会,我想计算他们之间的天数
但我也希望最后一天能被计算在内。
示例:
- 我和我妻子从【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);