求和node.js中的两个日期?

时间:2016-05-22 20:02:02

标签: javascript node.js

我试图将两个日期相加。

date1和date2是Date()对象。

我读了其他问题并用Google搜索了..我尝试了这种方式,但它返回了一个负数

extend()

date1:​​1901-02-01T00:10:00.000Z

date2:1901-01-31T23:07:23.000Z

结果:-4349551357000

我做错了什么?

2 个答案:

答案 0 :(得分:0)

求和两个时间差可能会导致将来溢出的值非常远(如果在使用某些32位整数进行内部计算时结果为负时间戳,则无法将新Date()从该值更新为有效日期)

"新日期(millis)"不保证涵盖范围非常广泛的日期(远在过去或将来),但仅适用于有限的时间戳范围内。

所以问题是:date1和date2的值是多少? - 如果它们都是绝对时间戳,则它们的总和是完全无意义的。 - 如果一个是绝对的而另一个是相对持续时间,这对于小的正持续时间是有意义的,并且总和是绝对时间戳。 - 如果两者都是相对的,结果也是相对的。 - 负相对持续时间也可能不适用于getTime(),更常见的是所有循环日历计算,如果它们内部使用了一些" mod"运算符或一些整数除法(截断为零,而不是使用floor()):这可能会禁止计算某些字段的有效值,如年,周,月,甚至只是小时(模24),分钟或秒(模数) 60):你得到溢出/下溢,或未经测试/不支持的日期范围的近似值

正如您刚刚编辑的那样,我看到您正在尝试将两个绝对日期相加。 在绝对日期使用getTime()时,返回的值已经是巨大的值(从过去的一个时代开始),它们的总和将溢出一些32位实现的容量。

所以你得到负值......

自己看:记录date1.getTime()和date2.getTime()

的各个值

您正在尝试的是计算两个绝对日期的差异,而不是总和,以毫秒为单位返回持续时间。

答案 1 :(得分:-1)

您应该从每个日期中减去零日期以随时间进行操作。

var t0 = Date(0,0,0)).getTime();
var t1 = (new Date(0, 0, 0, 0, 0, 15)).getTime() - t0; // 15000 ms
var t2 = (new Date(0, 0, 0, 0, 0, 30)).getTime() - t0; // 30000 ms
var sum = t1 + t2; // 45000ms

您可以使用moment.js之类的内容来简化这样的事情:

var sum = moment()
  .hour('12').minute('44')
  .add(4,'hours').add(20, 'minutes')
  .format("HH:mm");

或实施它:

// Convert a time in hh:mm format to minutes
function timeToMins(time) {
  var b = time.split(':');
  return b[0]*60 + +b[1];
}

// Convert minutes to a time in format hh:mm
// Returned value is in range 00  to 24 hrs
function timeFromMins(mins) {
  function z(n){return (n<10? '0':'') + n;}
  var h = (mins/60 |0) % 24;
  var m = mins % 60;
  return z(h) + ':' + z(m);
}

// Add two times in hh:mm format
function addTimes(t0, t1) {
  return timeFromMins(timeToMins(t0) + timeToMins(t1));
}

console.log(addTimes('12:13', '01:42')); // 13:55
console.log(addTimes('12:13', '13:42')); // 01:55
console.log(addTimes('02:43', '03:42')); // 06:25