【问题标题】:Convert time in HH:MM:SS format to seconds only?仅将 HH:MM:SS 格式的时间转换为秒?
【发布时间】:2011-06-17 13:53:58
【问题描述】:

如何将HH:MM:SS格式的时间转换为单位秒数?

P.S.时间有时可能仅采用MM:SS 格式。

【问题讨论】:

    标签: php time


    【解决方案1】:

    什么都不需要explode

    $str_time = "23:12:95";
    
    $str_time = preg_replace("/^([\d]{1,2})\:([\d]{2})$/", "00:$1:$2", $str_time);
    
    sscanf($str_time, "%d:%d:%d", $hours, $minutes, $seconds);
    
    $time_seconds = $hours * 3600 + $minutes * 60 + $seconds;
    

    如果你不想使用正则表达式:

    $str_time = "2:50";
    
    sscanf($str_time, "%d:%d:%d", $hours, $minutes, $seconds);
    
    $time_seconds = isset($seconds) ? $hours * 3600 + $minutes * 60 + $seconds : $hours * 60 + $minutes;
    

    【讨论】:

    • 甜蜜的解决方案。但如果 HH 不存在,这不会中断吗?
    • 刚刚修好了它就不会了。
    • 在使用时间函数时,我必须弄乱时区才能让它正确,但这要简单得多。
    • 最后一行的错误:$time_seconds = isset($seconds) ? $hours * 3600 + $minutes * 60 + $seconds : $hours * 60 + $minutes;应该是$time_seconds = isset($hours) ? $hours * 3600 + $minutes * 60 + $seconds : $minutes * 60 + $seconds;
    • 其实最后一行不应该是: isset($seconds) 吗? $小时* 3600 + $分钟* 60 + $秒:$小时* 60 + $分钟;如果没有小时,则需要将小时视为分钟,将分钟视为秒。例如:10:01 应该是 601 秒。
    【解决方案2】:

    我认为最简单的方法是使用strtotime()函数:

    $time = '21:30:10';
    $seconds = strtotime("1970-01-01 $time UTC");
    echo $seconds;
    
    // same with objects (for php5.3+)
    $time = '21:30:10';
    $dt = new DateTime("1970-01-01 $time", new DateTimeZone('UTC'));
    $seconds = (int)$dt->getTimestamp();
    echo $seconds;
    

    demo


    函数date_parse()也可以用于解析日期和时间:

    $time = '21:30:10';
    $parsed = date_parse($time);
    $seconds = $parsed['hour'] * 3600 + $parsed['minute'] * 60 + $parsed['second'];
    

    demo


    如果您将使用strtotime()date_parse() 解析格式MM:SS,它将失败(date_parse() 用于strtotime()DateTime),因为当您输入像xx:yy 这样的格式时,解析器会假定它是HH:MM 而不是MM:SS。我建议检查格式,如果您只有 MM:SS,请在前面加上 00:

    demo strtotime() demo date_parse()


    如果你有超过 24 小时,那么你可以使用下一个函数(它适用于 MM:SSHH:MM:SS 格式):

    function TimeToSec($time) {
        $sec = 0;
        foreach (array_reverse(explode(':', $time)) as $k => $v) $sec += pow(60, $k) * $v;
        return $sec;
    }
    

    demo

    【讨论】:

    • strtotime() 不允许小时数超过 24 - 使用 25 或更高将返回“false”。
    • 您在 24 小时内的第三个答案正是我所需要的。 array_reverse 并在 : 上爆炸,然后导致再次穿越 foreach 和另一次 pow(因此 hh:mmhh:mm:ss i> 在不修改功能的情况下工作)是天才之举。卓越的代码。我很难想象一个更有效的例子。谢谢!
    • 我只是看了第一个答案,然后想,如果我使用 Unix 纪元会怎样......我的投票!
    • 第三个选项适用于我可以使用的所有有效格式。 ?
    • 第一个选项$seconds = strtotime("1970-01-01 $time UTC"); 应该是最短的答案并且被接受。 1970-01-01 的使用很亲切!
    【解决方案3】:
        $time = 00:06:00;
        $timeInSeconds = strtotime($time) - strtotime('TODAY');
    

    【讨论】:

      【解决方案4】:

      您可以使用strtotime 函数从today 00:00:00 返回秒数。

      $seconds= strtotime($time) - strtotime('00:00:00');
      

      【讨论】:

      • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
      【解决方案5】:

      在伪代码中:

      split it by colon
      seconds = 3600 * HH + 60 * MM + SS
      

      【讨论】:

      • 正如他所写,它是伪代码。 “假装代码”来解释如何做某事。
      • 它是否是伪代码并不重要,因为该问题需要支持此答案不支持的 MM:SS 格式。
      【解决方案6】:

      试试这个:

      $time = "21:30:10";
      $timeArr = array_reverse(explode(":", $time));
      $seconds = 0;
      foreach ($timeArr as $key => $value)
      {
          if ($key > 2) break;
          $seconds += pow(60, $key) * $value;
      }
      echo $seconds;
      

      【讨论】:

      • 我喜欢它! $time = "01:23:54:21:30:10" 给我的答案是 1087421410 秒。
      • 立即尝试。当然,您可以传递“898989:8989898:899899”之类的内容,但我假设基本验证将在代码达到秒计算之前输入的时间完成。
      【解决方案7】:

      简单

      function timeToSeconds($time)
      {
           $timeExploded = explode(':', $time);
           if (isset($timeExploded[2])) {
               return $timeExploded[0] * 3600 + $timeExploded[1] * 60 + $timeExploded[2];
           }
           return $timeExploded[0] * 3600 + $timeExploded[1] * 60;
      }
      

      【讨论】:

        【解决方案8】:
        function time2sec($time) {
            $durations = array_reverse(explode(':', $item->duration));
            $second = array_shift($durations);
            foreach ($durations as $duration) {
                $second += (60 * $duration);
            }
            return $second;
        }
        echo time2sec('4:52'); // 292
        echo time2sec('2:01:42'); // 7302
        

        【讨论】:

        • 这个答案是最干净的,除了$item->duration,它应该被$time替换。它可能应该进行一些转换。
        【解决方案9】:
        <?php
        $time    = '21:32:32';
        $seconds = 0;
        $parts   = explode(':', $time);
        
        if (count($parts) > 2) {
            $seconds += $parts[0] * 3600;
        }
        $seconds += $parts[1] * 60;
        $seconds += $parts[2];
        

        【讨论】:

        • 如果没有时间只有 32:32 怎么办?
        • 那就不行了。您显然需要先验证格式。并删除前 $seconds += 部分
        • 翻转数组有什么帮助?
        • No.. 如果 HH 不存在,翻转数组将导致秒被视为小时。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-16
        • 1970-01-01
        • 2012-02-10
        • 1970-01-01
        • 2012-02-20
        相关资源
        最近更新 更多