【问题标题】:Converting a stopwatch time to milliseconds (regex)将秒表时间转换为毫秒(正则表达式)
【发布时间】:2011-06-02 09:29:51
【问题描述】:

我试图找出将包含时间的字符串转换为整数毫秒的最佳方法。我正在使用使用一堆 preg_match() 和一些数组处理的次优方式,但我想知道是否有一种优雅的方式。

以下是一些秒表时间示例(有些实际上不会在秒表上看到,但无论如何都需要转换):

3:34:05.81

34:05

5 (just 5 seconds)

89 (89 seconds)

76:05 (76 minutes, 5 seconds)

毫秒不会超过小数点后 2 位。你可以给我一个使用 PHP 或 Javascript 正则表达式函数的例子。

谢谢!

【问题讨论】:

    标签: php javascript regex time


    【解决方案1】:

    我知道它已经解决了.. 但这只是 javascript 的一个想法..

    String.prototype.sw2ms = function() {
        var a = [86400000, 3600000, 60000, 1000];
        var s = this.split(/\:/g);
        var z = 0;
    
        while (s.length && a.length)
            z += a.pop() * Number(s.pop());
    
        return z;
    };
    alert("3:45:03.51".sw2ms());
    alert("10:37".sw2ms());
    alert("05.81".sw2ms());
    alert("5".sw2ms());
    

    【讨论】:

    • 相当漂亮——我唯一担心的是向本机对象添加属性可能会在以后引起问题(即谷歌地图)。但是如果你把它做成一个独立的函数,那看起来不错!
    【解决方案2】:

    在这种情况下,我不会费心使用 regexp

    只需 explode(用 ':' 分割)字符串,然后执行反向分析 - 你总是有几秒钟(也许是几毫秒)。从 array[lastelement] (seconds) 开始,然后是前一个...

    例如

    在 PHP 中

    function getMilliseconds($input)
    {
      $a = explode(':', $input);
      $n = count($a); // number of array items
    
      $ms = 0; // milliseconds result
    
      if ($n > 0)
      {
         $b = explode('.', $a[$n-1]);
         if (count ($b) > 1)
         {
           $m = $b[1];
           while (strlen($m) < 3) $m .= '0'; // ensure we deal with thousands
           $ms += $m;
         }
         $ms += $b[0] * 1000;
    
         if ($n > 1) // minutes
         {
           $ms += $a[$n-2] * 60 * 1000;
    
           if ($n > 2) // hours
           {
             $ms += $a[$n-3] * 60 * 60 * 1000;
           }
         }
      }
      return $ms;
    }
    

    在 JavaScript 中

    (只是 PHP 到 Javascript 的转换)

    function getMilliseconds(input)
    {
      var a = input.split(':');
      var n = a.length; // number of array items
    
      var ms = 0; // milliseconds result
    
      if (n > 0)
      {
         var b = a[n-1].split('.');
         if (b.length > 1)
         {
           var m = b[1];
           while (m.length < 3) m += '0'; // ensure we deal with thousands
           ms += m - 0; // ensure we deal with numbers
         }
         ms += b[0] * 1000;
    
         if (n > 1) // minutes
         {
           ms += a[n-2] * 60 * 1000;
    
           if (n > 2) // hours
           {
             ms += a[n-3] * 60 * 60 * 1000;
           }
         }
      }
      return ms;
    }
    

    【讨论】:

    • 我最终得到了我认为让它更短一点的东西——你觉得这有什么陷阱吗?
    • $times = explode(':', $time); $毫秒 = 1000*(array_pop($times) + array_pop($times)*60 + array_pop($times)*3600);
    • 它要短得多 :-) 就我个人而言,我更喜欢处理特定情况的干净代码。在您的解决方案中,您不关心毫秒:例如0.1 不是1ms 它实际上是100ms,因为它应该被读取为0.100。除了你假设 PHP 将评估 array_pop 的顺序 - 因为只有 +,运算符的 precedence 不会干预,但除非在 a + b + c PHP将从a 开始,然后是b,最后是c(我不知道),这是一个错误的假设。反正代码读起来有歧义,不推荐。
    • 嗯.. 好点。我一直认为它从左到右评估加法,但有时它可能会以不同的方式对其进行优化。我想这符合那句老话,假设事情是不好的;)
    • 假设事情是一种进步的方式......但它必须在某个时候得到确认。关于这一点,需要在 PHP 文档中进行检查,但我再次不提倡那种编程。但是例如假设在if (a &amp;&amp; b) 中,b 不会被评估如果afalse 是准确的,并且非常方便(在提及数组的一项之前检查数组大小以条件为例)。
    【解决方案3】:

    使用正则表达式没有明显的优势:

    function parseStopwatchTime(time) {
        var splitTime = time.split(':'), // explode function in PHP
            secs = 0;
    
        if(time.length < 1 || time.length > 3) {
            return NaN;
        }
    
        for(var i = 0; i < time.length; i++) {
            secs *= 60;
            secs += +splitTime[i]; // JavaScript's unary plus operator
                                   // casts from a string to a number
                                   // so that it can safely be added.
        }
    
        return secs * 1000; // convert from seconds to milliseconds
    }
    

    如果您的秒表以天为单位计算(仍然不需要正则表达式),则需要更多代码,但这对于几小时、几分钟和(几分之一)秒来说已经足够了。

    【讨论】:

    • 感谢您的回答!我希望我可以将这两个答案都作为已接受的答案进行检查,但由于我不能,所以我基于谁先回答。
    猜你喜欢
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2016-03-04
    • 2013-03-09
    相关资源
    最近更新 更多