计算日期的差异,得到小时和秒的差异 - 理想情况下是js,否则是moment.js

时间:2016-09-30 15:23:01

标签: javascript date momentjs difference

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

  1. 将收到的unix日期转换为js日期,
  2. 将当前日期保存为日期,
  3. 将两者一起传递给moment.js以及他们的格式以获得差异
  4. 转换为毫秒
  5. ms的差异转换为片刻并返回小时分秒
  6. 我遇到了一个问题,其中特定版本的时刻会解决这个问题,而其他人则会在计算差异时将异常作为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);
    

    JS fiddle

1 个答案:

答案 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;
&#13;
&#13;

PS

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