我有开始日期和结束日期,我需要将它们转换为 UTC 并计算中间的天数(包括天数)。
例如:
(01/08/15 10:00 GMT+3) - (04/08/15 10:00 GMT+3) 将返回 4
(01/08/15 00:00 GMT+3) - (04/08/15 10:00 GMT+3) 将返回 5
以下代码适用于第一种情况的日期,但不适用于第二种情况(转换后还有额外的一天):
var startDateInUTC = new Date(start.getUTCFullYear(), start.getUTCMonth(), start.getUTCDate(), start.getUTCHours(), start.getUTCMinutes(), start.getUTCSeconds());
var endDateInUTC = new Date(end.getUTCFullYear(), end.getUTCMonth(), end.getUTCDate(), end.getUTCHours(), end.getUTCMinutes(), end.getUTCSeconds());
var totalDays = Math.floor((endDateInUTC - startDateInUTC) / (1000 * 60 * 60 * 24)) + 1;
我尝试将 Math.floor 更改为 Math.round 但在某些情况下这只会增加我一天的时间。
我做错了什么?
最佳答案
function calculate(start, end)
{
var startDateInUTC = new Date(start.getUTCFullYear(), start.getUTCMonth(), start.getUTCDate(), start.getUTCHours(), start.getUTCMinutes(), start.getUTCSeconds());
var endDateInUTC = new Date(end.getUTCFullYear(), end.getUTCMonth(), end.getUTCDate(), end.getUTCHours(), end.getUTCMinutes(), end.getUTCSeconds());
return Math.floor(millisecondsToDays = (Date.parse(endDateInUTC) - Date.parse(startDateInUTC)) / 1000 / 3600 / 24);
}
console.log(calculate(new Date("2015/08/01 10:00:00"), new Date("2015/08/04 10:00:00")));
console.log(calculate(new Date("2015/08/01 00:00:00"), new Date("2015/08/04 10:00:00")));
//the answer in both cases will be 3
在这里使用Date.parse
。它会将日期转换为 timeStamps
。您可以减去这些,然后计算回天数。使用 Math.floor
向下舍入,因为 6.25
是 6 天 6 小时。
timeStamps
是自 1970/01/01 00:00:00
以来经过的毫秒数。该日期始终为 UTC。当您有两个时间戳时,您可以计算它们之间的差异。 Date.parse()
返回有效日期的时间戳。 new Date(timestamp)
将根据时间戳返回日期。
要获得日期障碍,您可以进行额外的计算:
(start time + 24 * days + end time) / 24
将这个数字四舍五入,您就得到了日间障碍。
例子:
21 + 24 * 3 + 7 = 100
103 / 24 = 4.1666666.....
Math.floor(4.166666) = 4;
关于Javascript:计算转换为UTC的2天之间的时差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31812068/