【问题标题】:String to date conversion not working correctly in Javascript字符串到日期的转换在 Javascript 中无法正常工作
【发布时间】:2012-11-08 19:26:37
【问题描述】:

我需要使用 Javascript 以这种格式获取时差:“HH:MM:SS”。

我试过这个:

var diff = Date.parse( time2) - Date.parse( time1 );
var total_time = (diff / 1000 / 60 / 60) + ":" + (diff / 1000 / 60) + ":" + (diff / 1000);

还有这个:

var diff = new Date( time2) - new Date( time1 );
var total_time = (diff / 1000 / 60 / 60) + ":" + (diff / 1000 / 60) + ":" + (diff / 1000);

这些是time2和time1的值:

time1: "2012-11-07 15:20:32.161"
time2: "2012-11-07 17:55:41.451"

我在这两种情况下得到的结果是:

total_time= 0.5250819444444444:31.504916666666666:1890.295

你看到的不正确

【问题讨论】:

  • 不要重新发明轮子 :) moment.js
  • 如果他真的只需要在某一时刻自己构建它可能比包含另一个库更好。另外,这是很好的锻炼。 :D

标签: javascript html date


【解决方案1】:

我认为您得到错误的差异值,因为. 分隔的日期中有毫秒部分。它没有被数据解析器正确接受。

尝试使用不包括毫秒的日期和时间部分,如下所示:

 var diff = Date.parse(time2.split(".")[0]) - Date.parse( time1.split(".")[0]);

当你得到错误的差异diff时,你的时间计算也是错误的。

应该是:

       var second = Math.floor(diff /1000);
        //convert the seconds into minutes and remainder is updated seconds value
       var minute = Math.floor(second /60);
       second = second % 60;

        //convert the minutes into hours and remainder is updated minutes value
       var hour = Math.floor(minute/60);
       minute = minute %60;

       var total_time= hour+":" minute+":"+second;

【讨论】:

  • 好吧,当我在 jsfiddle 上运行您或我的代码时,它会将 2:35:9 输出,这显然是正确的区别,包括毫秒内的 .
  • 谢谢您,您的代码也可以正常工作,但@clentfort 的评分较低,所以我会稍微提高他的评分:)
  • @clentfort:在您计算差异的方式上,我看不出两个答案有什么不同。正如我强调的那样,它的解析器问题在您使用 new Date() 时不会出现。
  • 谢谢。 :) 我实际上更喜欢我上面的这种方法,因为它不是那么冗长。我选择了更详细的方式来告诉你问题出在哪里。
【解决方案2】:

您忘记删除已从diff 计算的毫秒数。这是一个非常详细的示例,说明如何以适当的方式进行操作。

var time1 = "2012-11-07 15:20:32.161",
    time2 = "2012-11-07 17:55:41.451",

    SECOND = 1000,
    MINUTE = SECOND* 60,
    HOUR = MINUTE* 60;

var diff = new Date(time2) - new Date(time1);

var hours = Math.floor(diff / HOUR); // Calculate how many times a full hour fits into diff
diff = diff - (hours * HOUR); // Remove hours from difference, we already caluclated those
var minutes = Math.floor(diff / MINUTE); // Calculate how many times a full minute fits into diff
diff = diff - (minutes * MINUTE); // Remove minutes from difference
var seconds = Math.floor(diff / SECOND); // As before
diff = diff - (seconds * SECOND);
var rest = diff;

var total_time = hours + ":" + minutes + ":" + seconds + " " + rest ;

DEMO

【讨论】: