Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 计算日期差异,以小时、分钟和秒为单位计算差异——最好是通过js,否则是moment.js_Javascript_Date_Momentjs_Difference - Fatal编程技术网

Javascript 计算日期差异,以小时、分钟和秒为单位计算差异——最好是通过js,否则是moment.js

Javascript 计算日期差异,以小时、分钟和秒为单位计算差异——最好是通过js,否则是moment.js,javascript,date,momentjs,difference,Javascript,Date,Momentjs,Difference,我通过以下方式计算了日期差异: 将收到的unix日期转换为js日期 将当前日期保存为js日期 将两者连同其格式一起传递到moment.js以获得差异 转换为毫秒 毫秒的差值转换为一个瞬间,并返回小时分秒 我遇到了这样一个问题:特定版本的“时刻”解决了这个问题,其他版本在计算差异时在内部抛出异常作为nan。我很乐意使用简单的js,希望能绕过这个场景 上传了一个提琴,它不会运行,除非你注释掉瞬间部分,因为在cdn上找不到瞬间.js版本 我更关注逻辑和一些伪代码/语法,而不是一个工作示例。JS版本的问

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

  • 将收到的unix日期转换为js日期
  • 将当前日期保存为js日期
  • 将两者连同其格式一起传递到moment.js以获得差异
  • 转换为毫秒
  • 毫秒的差值转换为一个瞬间,并返回小时分秒
  • 我遇到了这样一个问题:特定版本的“时刻”解决了这个问题,其他版本在计算差异时在内部抛出异常作为nan。我很乐意使用简单的js,希望能绕过这个场景

    上传了一个提琴,它不会运行,除非你注释掉瞬间部分,因为在cdn上找不到瞬间.js版本

    我更关注逻辑和一些伪代码/语法,而不是一个工作示例。JS版本的问题是,当计算出的两个unix日期之间的差值被转换为一个日期*1000(毫秒)时,它就变成了一个1970年的日期。另外,js中的getMinutes()获取该时间戳的文字分钟数,而不是总分钟数,与小时数等相同

    下面是一个示例:

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

    Matt链接到了一个复制的for moment.js,因此这只是一个POJS解决方案

    UNIX时间值为自历元起的秒,ECMAScript时间值为自同一历元起的毫秒。您所需要做的就是将两者转换为相同的单位(秒或毫秒),并将差值转换为小时、分钟和秒

    假设2016-10-02T00:00:00Z的UNIX时间值为1475366400,因此要获得主机系统时区中从那时到现在的小时、分钟和秒数,请对从那时到现在的差异进行一些简单的数学计算:

    var-then=1475366400,//2016-10-02T00:00:00Z的Unix时间值
    now=Date.now(),//当前时间值(毫秒)
    diff=now-then*1000,//以毫秒为单位的差异
    符号=diff<0?'-':'';
    差异*=符号=='-'-1 : 1;
    var hrs=diff/3.6e6 | 0,
    分钟=差异%3.6e6/6e4 | 0,
    秒=差值%6e4/1e3;
    //帮助器填充单个数字
    
    函数z(n){return(nMatt已经链接到一个复制的for moment.js,所以这只是一个POJS解决方案

    UNIX时间值是自历元起的秒,ECMAScript时间值是自同一历元起的毫秒。您只需将两者转换为相同的单位(秒或毫秒),并将差值转换为小时、分钟和秒

    假设2016-10-02T00:00:00Z的UNIX时间值为1475366400,因此要获得主机系统时区中从那时到现在的小时、分钟和秒数,请对从那时到现在的差异进行一些简单的数学计算:

    var-then=1475366400,//2016-10-02T00:00:00Z的Unix时间值
    now=Date.now(),//当前时间值(毫秒)
    diff=now-then*1000,//以毫秒为单位的差异
    符号=diff<0?'-':'';
    差异*=符号=='-'?-1:1;
    var hrs=diff/3.6e6 | 0,
    分钟=差异%3.6e6/6e4 | 0,
    秒=差值%6e4/1e3;
    //帮助器填充单个数字
    
    函数z(n){return(对于moment.js解决方案,我将使用
    duration.asSeconds()
    ,然后将其传递到
    格式(“h:mm:ss”)
    @varonton这样做有什么好处?感谢您的时间:)
    moment(moment.duration(ms.asSeconds()).format(“hh:mm:ss”)
    这只是一个简单的方法。@Varonton,构造函数期望的是毫秒,而不是秒。而且,
    hh
    将在12小时停止。您可以使用
    hh
    24小时,但仍然有限。更完整的解决方案是。感谢您澄清@Matt Johnson!目前我将使用
    duration.asSeconds()
    然后将其传递到
    格式(“h:mm:ss”)
    @varonton这样做有什么好处?感谢您的时间:)
    瞬间(瞬间持续时间(ms.asSeconds()).format(“hh:mm:ss”)
    这只是一个简单的方法。@Varonton,构造函数期望毫秒而不是秒。而且,
    hh
    将在12小时停止。你可以使用
    hh
    24小时,但你仍然有限。更完整的解决方案是。感谢你澄清@Matt Johnson!首先感谢你分享你的答案!关于这一行“diff*=sign='-'?-1:1;”我是否正确地认为它以以下方式执行:首先检查sign并赋值-1或1,然后将赋值乘以diff并赋值给diff.correct?在这一行中:“diff%6e4/1e3”“首先是模数,然后将其结果除以以下值。对吗?@JoeBorg对两个问题都是肯定的。对于第一个问题,它相当于
    Math.abs(diff)
    ,这可能是一种更好的书写方式。符号需要单独处理,否则您可能会得到类似-1:-23:-42的结果。首先感谢您分享您的答案!关于这一行,“diff*=sign='-'?-1我是否正确地认为它是以以下方式执行的:首先检查符号并赋值-1或1,然后将赋值乘以diff并赋值给diff.correct?在这一行中:“diff%6e4/1e3”首先是模数,然后是它的结果除以以下值。正确吗?@JoeBorg对这两个问题都是肯定的。对于第一个问题,它相当于
    Math.abs(diff)
    ,这可能是更好的书写方式。符号需要单独处理,否则可能会得到类似-1:-23:-42的结果。