我通过以下方式计算了日期差异:
我遇到了一个问题,其中特定版本的时刻会解决这个问题,而其他人则会在计算差异时将异常作为nan内部抛出。我希望只使用普通的js来做这件事,希望能够绕过这种情况。
上传了一个小提琴,它不会运行除非你注释掉那一刻因为没有在cdn上找到一个moment.js版本。
我更喜欢逻辑和一些伪代码/语法而不是一个工作示例。 JS版本的问题是,当两个unix日期之间的计算差异然后转换为日期* 1000毫秒时,它将成为1970日期。同样,js中的getMinutes()获取该时间戳的文字分钟,而不是总分钟数,相同的小时等等。
这是JS的例子:
var now = new Date(Date.now()),
ms = moment(then, "DD/MM/YYYY HH:mm:ss").diff(moment(now, "DD/MM/YYYY HH:mm:ss")),
d = moment.duration(ms),
formattedMomentDateDifference = Math.floor(d.asHours()) + ":";
formattedMomentDateDifference += Math.floor(d.minutes()) + ":";
formattedMomentDateDifference += Math.floor(d.seconds());
$('#momentdifference').val(formattedMomentDateDifference);
以下是js日期示例:
var then = cleanedReceivedDate, //cleaned received date in unix
difference = Math.floor(then - now)*1000, /* difference in milliseconds */
msDifferenceInDate = new Date(difference),
hoursDiff = msDifferenceInDate.getHours(),
minutesDiff = "0"+msDifferenceInDate.getHours(),
secondsDiff = "0"+msDifferenceInDate.getSeconds(),
formattedTime = hoursDiff + ':' + minutesDiff.substr(-2) + ':' + secondsDiff.substr(-2);
$('#jsdifference').val(formattedMomentDateDifference);
答案 0 :(得分:2)
Matt已链接到moment.js的副本,因此这只是一个POJS解决方案。
UNIX时间值是自纪元以来的秒数,ECMAScript时间值是自同一纪元以来的毫秒数。您需要做的就是将两者转换为相同的单位(秒或毫秒),并将差异转换为小时,分钟和秒。
说2016-10-02T00:00:00Z的UNIX时间值是1475366400,所以要在主机系统的时区中获取从那时到现在的小时,分钟和秒,请做一些简单的数学运算。从那时到现在的差异:
var then = 1475366400, // Unix time value for 2016-10-02T00:00:00Z
now = Date.now(), // Current time value in milliseconds
diff = now - then*1000, // Difference in milliseconds
sign = diff < 0? '-' : '';
diff *= sign == '-'? -1 : 1;
var hrs = diff/3.6e6 | 0,
mins = diff%3.6e6 / 6e4 | 0,
secs = diff%6e4 / 1e3 ;
// Helper to pad single digit numbers
function z(n){return (n<10?'0':'') + n}
console.log(sign + hrs + ':' + z(mins) + ':' + z(secs));
&#13;
PS
在new Date(Date.now())
中使用 Date.now 完全是多余的,结果与new Date()
相同。