Javascript: 转换为UTC计算2天的时差

Javascript: Calculate time difference between 2 days with conversion to UTC

我有开始日期和结束日期,我需要将它们转换为 UTC 并计算中间的天数(包括)。

例如:

(01/08/15 10:00 GMT+3) - (04/08/15 10:00 GMT+3) 将 return 4

(01/08/15 00:00 GMT+3) - (04/08/15 10:00 GMT+3) 将 return 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() returns 有效日期的时间戳。 new Date(timestamp) 将 return 基于时间戳的日期。

要获得日期障碍,您可以进行额外的计算:

(start time + 24 * days + end time) / 24

将这个数字四舍五入,你就得到了日间障碍。

示例:

21 + 24 * 3 + 7 = 100
103 / 24 = 4.1666666.....

Math.floor(4.166666) = 4;

我最终收集了一个非常简单的解决方案,结合了一些 Mouser 的回答(谢谢!)

function calcStreamDaysInUTC(start, end) {
    try {
        // Translate to UTC
        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());
        // Reset everything but the date
        startDateInUTC.setHours(0);
        startDateInUTC.setMinutes(0);
        startDateInUTC.setSeconds(0);
        endDateInUTC.setHours(0);
        endDateInUTC.setMinutes(0);
        endDateInUTC.setSeconds(0);

        var totalDays = (endDateInUTC - startDateInUTC) / (1000 * 60 * 60 * 24) + 1;
        return totalDays;
    } catch (e) {
        return -1;
    }
}