JS计算时间差问题,求方法。。。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS计算时间差问题,求方法。。。相关的知识,希望对你有一定的参考价值。

是这样的:要计算两个时间相差的秒和毫秒数。
例如:
08:12:34.008 - 08:12:32.252 = 1.756

就是这种格式的时间字符串,结果范围不超过59.999秒,求大神支招啊。

PS:自己想过吧两个时间转换为毫秒数,在用差值除以1000,可是不知道怎么讲这种格式(08:12:34.008)的字符串转换为毫秒数!!!
先谢谢各位的回答啊,非常感谢。
发现个小问题,请教下大家,parseInt(“008”)出来的结果是0,不是8,这是为什么?
Number()函数到是可以,但是后续计算比较繁琐(x*60*60*1000)!

大家基本上也都是采用的毫秒差的解决方案,记得Date中有个方法可以直接将字符串转换为毫秒数,查了一晚上API终于找到了。因为日期是从1970年开始的,所以我在前边写死了日期加上时间直接转换为了毫秒数:Date.parse(“1970-01-01 ”+startTime);早8点之前会出现负数,所以给成1970-01-02合适。

参考技术A /**
 * timeDiff(first,sencond,[pattern])
 */
 var TimeDiff = (function (f) 
        return function (a, b, p) 
            return f(a, p) - f(b, p);
        ;
    
    (function (t, p) 
        return(function (h, m, s, ss, f) 
            return f = parseInt, 1000 * (60 * (60 * f(h || 0) + f(m || 0)) + f(s || 0)) + f(ss || 0);
        ).apply(0, (p || /^(\\d\\d):(\\d\\d):(\\d\\d)\\.(\\d\\d\\d)$/).exec(t).splice(1));
    ));      
      TimeDiff("08:12:34.008", "08:12:34.007");//楼主格式
      TimeDiff("9","8",/^()()(\\d)()$/);//计算两个分钟时间的毫秒差
      TimeDiff("12:34","13:34",/^()(\\d+):(\\d+)()$/);//计算分钟:秒格式的毫秒差

 如果要格式化就很简单了吧

    /**
     * TimeFmt(毫秒,格式)
     */
    var TimeFmt = function (t, f, d, i) 
        for (i in d = ss: 1000, s: 60, m: 60, h: 60) 
            f = f.replace(i, t % d[i]);
            t = parseInt(t / d[i]);
        
        return f;
    ;       
     TimeFmt(59999,"m.s");//这就是59.999
     parseFloat(TimeFmt(59999,"m.s"));//转为float
     TimeFmt(TimeDiff("08:12:34.008","08:12:32.252"),"s.ss");//

测试了一下,有个小bug,改正过了

追问

非常感谢您的回答,小弟愚钝啊,JS不熟,看不懂,呵呵。

追答

这个写法是简化代码长度的写法,基本思路是用
RegExp(正则表达式)对象,/(\d+):(\d+):(\d+)\.(\d+)/.exec("08:12:34.008")会返回5个元素的数组(假设为arr),第1个开始,是小括号对应的内容,arr.splice(1),是把arr分成2个数组,原数组只留arr[0],返回arr[1..4],传给了匿名函数function(h,m,s,ss)进行处理,结果算成毫秒。而function(h,m,s,ss)是匿名函数function(f)的第一个参数,匿名函数function(f)返回一个函数,这个函数就是真正的TimeDiff,他利用f,把两个时间字符串变成毫秒并相减,返回结果,注意p,如果传入,将会代替原来的正则表达式。我习惯简写。之所以用匿名函数,是因为两个辅助函数,对timediff函数没必要显示。timefmt更简单,利用javascript简单构造的对象ss:1000,...分别取格式化字符i,和禁制单位1000,60,60;
进行计算,每算一步,都替换一次对应的格式化字符(h,m,s,ss)

追问

匿名函数就晕这呢,for...in...语法也不懂,呵呵。感谢回答,辛苦辛苦。

为什么要规定只能采纳一个满意回答呢!!!

本回答被提问者采纳
参考技术B

这个 不一定要转换成date格式去弄的

分别对时分秒毫秒求差值,在加起来不也可以么

var exp=/(\\d+):(\\d+):(\\d+).(\\d+)/;
var date1="08:12:34.008",date2="08:12:32.252";
exp.test(date1);
var h1=parseInt(RegExp.$1)
    ,m1=parseInt(RegExp.$2)
    ,s1=parseInt(RegExp.$3)
    ,S1=parseInt(RegExp.$4)
;
exp.test(date2);
var h2=parseInt(RegExp.$1)
    ,m2=parseInt(RegExp.$2)
    ,s2=parseInt(RegExp.$3)
    ,S2=parseInt(RegExp.$4)
;
var miao=((h1-h2)*60+m1-m2)*60+s1-s2;
console.log(miao);
console.log(miao*1000+S1-S2);

参考技术C     function GetTime(strTime) 
      var t = strTime.split(/:|\\./);
      var Timeseconds = parseInt(t[0] * 60 * 60,10) + parseInt(t[1],10) * 60 + parseInt(t[2],10);
      var total = Timeseconds * 1000 + parseInt(t[3],10);
      return total;
    
    var spanTime = GetTime('08:12:34.008') - GetTime('08:12:32.252');
    var result = (spanTime / 1000).toFixed(3);

 

parseInt(“008”)出来的结果是0,不是8,是把008当做2进制了,所以要完整写parseInt(“008”,10)


楼主后来想到的方法很好,没有想到呀,呵呵,学习了。

var result = ((Date.parse('1970-1-1 08:12:34.008')-Date.parse('1970-1-1 08:12:32.252'))/1000).toFixed(3);

js求时间差

js求时间差

var date1=new Date();  //开始时间
alert("aa");
var date2=new Date();    //结束时间
var date3=date2.getTime()-date1.getTime()  //时间差的毫秒数
 

//计算出相差天数
var days=Math.floor(date3/(24*3600*1000))
 
//计算出小时数

var leave1=date3%(24*3600*1000)    //计算天数后剩余的毫秒数
var hours=Math.floor(leave1/(3600*1000))
//计算相差分钟数
var leave2=leave1%(3600*1000)        //计算小时数后剩余的毫秒数
var minutes=Math.floor(leave2/(60*1000))
 

//计算相差秒数
var leave3=leave2%(60*1000)      //计算分钟数后剩余的毫秒数
var seconds=Math.round(leave3/1000)
 

alert(" 相差 "+days+""+hours+"小时 "+minutes+" 分钟"+seconds+"")

 

以上是关于JS计算时间差问题,求方法。。。的主要内容,如果未能解决你的问题,请参考以下文章

js 录入时间 精确到小时.

求JS计算日期代码(在网页直接显示)!!!

求大神JS制作日期计算器的源代码

js求时间差

d3.js画圆弧和圆的坐标、弧长计算方法

js 怎么求两个日期相差几个月零几天?