我试图将两个日期相加。
date1和date2是Date()对象。
我读了其他问题并用Google搜索了..我尝试了这种方式,但它返回了一个负数
extend()
date1:1901-02-01T00:10:00.000Z
date2:1901-01-31T23:07:23.000Z
结果:-4349551357000
我做错了什么?
答案 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