【问题标题】:JS script durationJS 脚本持续时间
【发布时间】:2014-03-01 12:10:24
【问题描述】:

我编写的脚本有一个小问题,它应该以 hh:mm:ss 格式返回脚本的持续时间(执行时间)。

这是脚本:

var start = new Date();
{ 

CODE GOES IN HERE

}
var end = new Date();
var miliseconds = end - start;
function runTime(ms) {
var seconds = 0;
var minutes = 0;
var hours = 0;
if (ms > 1000) {
    seconds = (ms / 1000).toFixed(0);
    if (seconds > 60) {
        seconds -= 60;
        minutes = (seconds / 60).toFixed(0);
        if (minutes > 60) {
            minutes -= 60;
            hours = (minutes / 60).toFixed(0)
        }
    }
}
if (seconds.toString().length == 1) {
    var seconds = '0' + seconds;
}   
if (minutes.toString().length == 1) {
    var minutes = '0' + minutes;
}
if (hours.toString().length == 1) {
    var hours = '0' + hours;
}   
return("Job Done in: " + hours + ":" + minutes + ":" + seconds + "(" + miliseconds + "ms)");
 }
iimDisplay(runTime(miliseconds));

这些是一些示例输出:

Job Done in: 03:166:13548(13608024ms)
Job Done in: 00:51:3032(3091973ms)
Job Done in: 00:02:3706(3766265ms)
Job Done in: 00:50:2994(3053675ms)
Job Done in: 00:52:30(3152527ms)

正如您所看到的,有时它看起来不太正确,通常脚本会持续 40-60 分钟,因此大多数时间分钟都是准确的。

【问题讨论】:

  • 在 JS 中时间不容易考虑:momentjs.com
  • 我正在将它与 mozzila 插件一起使用...

标签: javascript time duration


【解决方案1】:

我认为你的问题在这里:

if (seconds > 60) {
    seconds -= 60;
    minutes = (seconds / 60).toFixed(0);
    if (minutes > 60) {
        minutes -= 60;
        hours = (minutes / 60).toFixed(0)
    }
}

当秒数大于 60 时,您只需取 60。例如,如果秒数为 189,您将得到 129 而不是 9,这正是您想要的。您必须计算分钟数,然后执行:

seconds = seconds - (minutes * 60);

你必须用分钟做同样的事情,但要花几个小时。

【讨论】:

    【解决方案2】:
    if (seconds > 60) {
        seconds -= 60;
    

    如果seconds 远大于 60 怎么办?只减去一次是不够的。你想要的是

          seconds %= 60;
    

    分钟也一样。

    顺便说一句,你应该使用 Math.floor() 而不是 .toFixed(0)

    【讨论】:

    • 哦,对不起,忽略不存在的“/60”部分,只是我尝试过的东西
    • @Trax:那么你可能会考虑removing it from the question,否则答案中不会被忽略 - 啊,你刚刚做到了。
    【解决方案3】:

    这里有一个公式可以让你的生活更轻松:

    hours = (ms / (1000*60*60));
    ms = ms % (1000*60*60)
    minutes = ms / (1000*60)
    ms = ms % (1000*60)
    seconds = ms / (1000)
    

    【讨论】:

      【解决方案4】:

      虽然其他发帖者指出了 @traxs 原始代码中明显的数学缺陷,但我想知道是否值得指出 Javascript 中的 Timer 函数(我在看着你 setTimeout em> 和 setInterval) 可能会产生 unexpected 的结果。

      var fireCount = 0;
      var start = new Date;
      var timer = setInterval(function() {
        if (new Date - start > 1000) { 
          clearInterval(timer); console.log(fireCount); return;
        }
        fireCount++;
      }, 0);
      

      此代码的三个示例运行: (在 OSX 10.8.5 上的 Safari 6.1.1 中):

        228
        227
        220
      

      (OSX 10.7.5 上的 Firefox 27.01):

        250
        250
        249
      

      您可以阅读更多关于 Javascript 中计时器的信息:at this John Resig Blogpost 或者 Trevor Burnham 的优秀 "Async JavaScript" 非常值得一读。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-14
        • 2014-11-16
        • 1970-01-01
        • 2019-01-25
        • 1970-01-01
        • 2020-09-24
        相关资源
        最近更新 更多