PHP - 小时差(HH:MM 格式)


PHP - hours difference (HH:MM format)

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

22:00 - 06:00

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

令人讨厌的是,我将不得不在Javascript中做完全相同的事情,所以我希望我能理解这个逻辑。在这种情况下,从一个约会中夺走另一个约会是行不通的......

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

function timeDiff($firstTime,$lastTime) {
    $firstTime=strtotime($firstTime);
    $lastTime=strtotime($lastTime);
    $timeDiff=$lastTime-$firstTime;
    return $timeDiff;
}
echo (timeDiff("10:00","12:00")/60)/60;

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

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

$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 等的解决方案都是如此。

没有一些日期函数:

$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';

您可以使用函数 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
   ?>

工作和最简单的示例:

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

您可以查看 date_diff ,它是此函数的别名:

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

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