【问题标题】:PHP - hours difference (HH:MM format)PHP - 小时差(HH:MM 格式)
【发布时间】:2012-04-27 13:54:47
【问题描述】:

我正在尝试计算在这里工作的人的轮班模式,从结束时间中减去开始时间在大多数情况下是可行的,但如果他们通宵工作则不行。例如,在10pm to 6am 工作的人将显示为:

22:00 - 06:00

我希望返回 8 hours,但我就是想不出最好的方法。

令人讨厌的是,我将不得不在 Javascript 中做同样的事情,所以我希望我能理解这个逻辑。在这种情况下,从另一个日期中删除一个日期是行不通的......

任何帮助将不胜感激,谢谢!

【问题讨论】:

标签: php time


【解决方案1】:
function timeDiff($firstTime,$lastTime) {
    $firstTime=strtotime($firstTime);
    $lastTime=strtotime($lastTime);
    $timeDiff=$lastTime-$firstTime;
    return $timeDiff;
}

echo (timeDiff("10:00","12:00")/60)/60;

最初写在这里:https://ao.ms/how-to-get-the-hours-difference-in-hhmm-format-in-php/

【讨论】:

  • 这可能是我最喜欢的解决方案 - 简单并以很好的格式返回日期,非常感谢大家:)
  • @Nick:请注意,如果您运气不好,根据您的地理位置和当前日期,此解决方案可能会产生意想不到的结果。我回答的最后一段解释了原因。
【解决方案2】:

老派,带有字符串操作和数学:

$input = '22:00 - 06:00';
preg_match('/(\d+):(\d+)\D*(\d+):(\d+)/', $input, $matches);
list(, $startHour, $startMin, $endHour, $endMin) = $matches;
$totalMinutes = ($endHour * 60 + $endMin - $startHour * 60 + $startMin + 1440) % 1440;
$hours = floor($totalMinutes / 60);
$mins = $totalMinutes % 60;

echo "works for $hours hours, $mins minutes";

具有日期/时间功能:

$input = '22:00 - 06:00';
list($start, $end) = array_map('trim', explode('-', $input));
$start = new DateTime($start.'+00:00');
$end = new DateTime($end.'+00:00');
if ($start > $end) $start->sub(new DateInterval('P1D'));
$interval = $end->diff($start);
echo "works for ".$interval->h." hours, ".$interval->m." minutes";

任何使用日期/时间函数的解决方案的恶魔陷阱:

如果您没有明确指定 $start$end 的偏移量,并且我们正在谈论夜班,并且代码在夏令时开始或结束的那一天运行,则结果将关闭无论 DST 偏移量是多少。

对于使用 DateTimestrtotime 等的任何解决方案都是如此。

【讨论】:

    【解决方案3】:

    没有一些日期功能:

    $start = '22:00';
    $end = '06:00';
    
    $getnum = function($value) {
        $pieces = explode(':', $value);
        if(count($pieces) > 0) {
            return (intval($pieces[0])*60)+intval($pieces[1]);
        }
    
        return 0;
    };
    
    $start_num = $getnum->__invoke($start);
    $end_num = $getnum->__invoke($end);
    
    $diff = max($start_num, $end_num) - min($end_num, $start_num);
    
    echo intval($diff / 60).'.'.($diff % 60).' hours';
    

    【讨论】:

    • 请注意,__invoke 仅在 PHP 5.3.0+ 中可用
    【解决方案4】:

    您可以使用函数 mktime (http://php.net/manual/en/function.mktime.php) 以整数格式返回秒数并减去两个日期。

    <?php
       $date1=mktime(1, 2, 3, 4, 5, 2006);
       $date2=mktime(1, 2, 3, 4, 5, 2008);
       $diference=$date2-$date1;
    
       echo $diference
    
       ?>
    

    【讨论】:

      【解决方案5】:

      工作和最简单的示例:

      $start = 22;
      $end = 6;
      
      if ($start > $end) {
          $end += 24;
      }
      
      $duration = $end - $start;
      
      echo 'Duration: ' . $duration . 'hours.';
      

      【讨论】:

      • 如果您将开始和结束时间设置为 22,您将获得 0 小时。例如,它也不适用于 06:30
      【解决方案6】:

      你可以查看date_diff,这是这个函数的别名:

      http://www.php.net/manual/en/datetime.diff.php

      MySQL 也有一个DATEDIFF() 函数,所以如果你从数据库中获取它们,你可以直接从 SQL 中获取(我知道你没有指定,但我只是想提一下)。

      【讨论】:

        猜你喜欢
        • 2022-08-18
        • 2012-10-11
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多