【问题标题】:calculate difference in dates, get difference in hours mins and seconds - ideally by js, otherwise moment.js计算日期的差异,获得小时分钟和秒的差异 - 最好通过 js,否则 moment.js
【发布时间】:2016-09-30 15:23:00
【问题描述】:

我已通过以下方式计算日期差异:

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

我遇到了一个问题,即特定版本的 moment 可以解决这个问题,而其他版本在 calc 差异时会在内部将异常抛出为 nan。很想只用普通的 js 来做,希望能绕过这种情况。

上传了一个小提琴,除非你注释掉 moment 部分,否则它不会运行,因为在 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);

JS fiddle

【问题讨论】:

  • 对于 moment.js 解决方案,我将使用 duration.asSeconds(),然后将其传递给 format("h:mm:ss")
  • @varontron 这样做有什么好处?谢谢你的时间:)
  • moment(moment.duration(ms).asSeconds()).format("hh:mm:ss") 只是一种简单的方法。 jsfiddl
  • @varontron,构造函数需要毫秒,而不是秒。此外,hh 将在 12 小时停止。你可以使用HH 24 小时,但你仍然受到限制。更完整的解决方案是here
  • 感谢@Matt Johnson 的澄清!

标签: javascript date momentjs difference


【解决方案1】:

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() 相同。

【讨论】:

  • 首先感谢您分享您的答案!关于这一行“diff *= sign == '-'?-1 : 1;”我是否正确地执行了以下方式:首先检查符号并分配-1或1,然后将分配的值乘以diff并分配给diff。正确的?在这一行中:“diff%6e4 / 1e3”首先是模数,​​然后是结果除以以下值。正确吗?
  • @JoeBorg——两个问题都是。首先,它相当于Math.abs(diff),这可能是一种更好的写法。该标志需要单独处理,否则您可能会得到类似 -1:-23:-42 的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多