【问题标题】:Operators with time format带时间格式的运算符
【发布时间】:2014-10-01 17:20:40
【问题描述】:

例如,我有 00:09:33.485 这次电影或剧集,我想增加 30 秒或 5 分钟,那么如何使它成为这样的 00:09:33.485 + 00:05:30.124 = 00:15:03.609 或像这样的 00:09:33.485 - 00:05:30.124 = 00:04:03.361

【问题讨论】:

    标签: php operators subtitle time-format


    【解决方案1】:

    好的,我编辑了 sjagr 的答案,这是减号:

    $time = '00:09:33.485';
    $add = '00:05:30.124';
    
    $timeMs = explode('.', $time);
    $addMs = explode('.', $add);
    
    $sumMs = $timeMs[1] - $addMs[1];
    $timeSplit = explode(':', $timeMs[0]);
    $addSplit = explode(':', $addMs[0]);
    
    if ($sumMs < 0) {
        $timeSplit[2] -= 1;
        $sumMs = $sumMs + 1000;
    }
    $sumMs = str_pad($sumMs, 3, '0', STR_PAD_LEFT);
    
    $i = 2;
    while ($i >= 0) {
        $timeSplit[$i] -= $addSplit[$i];
        if ($i > 0 && $timeSplit[$i] < 0) {
            $timeSplit[$i - 1] -= 1;
            $timeSplit[$i] = $timeSplit[$i] + 60;
        }
        $timeSplit[$i] = str_pad($timeSplit[$i], 2, '0', STR_PAD_LEFT);
        $i--;
    }
    
    $time = implode(':', $timeSplit);
    $time = $time . '.' . $sumMs;
    
    echo $time;
    

    【讨论】:

      【解决方案2】:

      您可以使用结合DateTime 类的标准时间格式来实现正确的时间格式和数学,但如果您坚持使用这种格式...

      $time = '00:09:33.485';
      $add = '00:05:30.124';
      
      $timeMs = explode('.', $time);
      $addMs = explode('.', $add);
      
      $sumMs = $timeMs[1] + $addMs[1];
      $timeSplit = explode(':', $timeMs[0]);
      $addSplit = explode(':', $addMs[0]);
      
      if ($sumMs > 1000) {
          $timeSplit[2] += 1;
          $sumMs = $sumMs - 1000;
      }
      $sumMs = str_pad($sumMs, 3, '0', STR_PAD_LEFT);
      
      $i = 2;
      while ($i >= 0) {
          $timeSplit[$i] += $addSplit[$i];
          if ($i > 0 && $timeSplit[$i] > 59) {
              $timeSplit[$i - 1] += 1;
              $timeSplit[$i] = $timeSplit[$i] - 60;
          }
          $timeSplit[$i] = str_pad($timeSplit[$i], 2, '0', STR_PAD_LEFT);
          $i--;
      }
      
      $time = implode(':', $timeSplit);
      $time = $time . '.' . $sumMs;
      
      echo $time; // Returns 00:15:03.609 - note that there's no handling for 24+ hours
      

      这是很多工作,所以你真的应该再次check out the docs on the DateTime class,特别是the add() function

      【讨论】:

      • 我也需要它在+- 上工作,这段代码在- 上工作?
      • @AdamMo。仅添加,因为这是您在问题范围内要求的内容。
      • @AdamMo。请参阅我的编辑,特别是 while ($i &gt;= 0) { 而不是 while ($i &gt; 0) {
      • @AdamMo。 if ($i &gt; 0 &amp;&amp; $timeSplit[$i] &gt; 59) { 是最新修复。如果您刚刚决定接受标准的 DateTime 格式,那么您再次意识到所有这些都是使用 DateTime 构建的?
      • 我想要这种格式的字幕,请问你可以为-写另一个代码吗?谢谢
      【解决方案3】:

      不幸的是,有一个解决方案只适用于整秒而不是毫秒:

      <?php
      function addtime($t1, $t2)
      {
        $d = date_create("1970-01-01 $t1");
        list($h, $m, $s) = explode(':', $t2);
        date_add($d, new DateInterval("PT{$h}H{$m}M{$s}S"));
        return date('H:i:s', $d->getTimestamp());
      }
      
      print addtime('00:09:33', '00:05:30');
      ?>
      

      对于时间的减法使用 date_sub() 而不是 date_add()。

      编辑:这里同样的功能包括毫秒:

      function addtime($t1, $t2)
      {
        list($t1, $ms1) = explode('.', $t1);
        $d = date_create("1970-01-01 $t1");
        list($h, $m, $s) = explode(':', $t2);
        list($s, $ms2) = explode('.', $s);
      
        date_add($d, new DateInterval("PT{$h}H{$m}M{$s}S"));
        $ts = $d->getTimestamp();
      
        $ms = $ms1 + $ms2;
        if($ms >= 1000) { $ms -= 1000; $ts++; }
      
        return date('H:i:s', $ts) . ".$ms";
      }
      
      print addtime('00:09:33.485', '00:05:30.124');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-25
        • 2017-02-19
        • 1970-01-01
        • 2020-02-03
        相关资源
        最近更新 更多