计算日期差异,获得小时、分钟和秒的差异 - 最好通过 js,否则 moment.js

calculate difference in dates, get difference in hours mins and seconds - ideally by js, otherwise moment.js

我通过以下方式成功计算了日期差异:

  1. 将收到的 unix 日期转换为 js 日期,
  2. 将当前日期保存为js日期,
  3. 将两者连同它们的格式一起传递给 moment.js 以获得差异
  4. 转换为毫秒
  5. 以毫秒为单位的差异转换为时刻 returns 小时 分钟 秒

我 运行 遇到了一个问题,特定版本的 moment 可以解决这个问题,而其他版本在计算差异时会在内部将异常作为 nan 抛出。很想用纯 js 来做,希望能避免这种情况。

上传了 fiddle,它不会 运行 除非你注释掉 moment 部分,因为在 cdn 上没有找到 moment.js 版本。

我更关注逻辑和一点 pseudocode/syntax 而不是工作示例。 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);

JS fiddle

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));

PS

new Date(Date.now())中使用Date.now完全是多余的,结果与new Date()相同。