我对php代码有一点问题,那就是发现员工在夜间工作了多少小时以及在白天工作了多少小时。
代码在这里:
function intersection($s1, $e1, $s2, $e2) {
if ($e1 < $s2)
return 0;
if ($s1 > $e2)
return 0;
if ($s1 < $s2)
$s1 = $s2;
if ($e1 > $e2)
$e1 = $e2;
return $e1 - $s1;
}
$start = strtotime("07:00");
$end = strtotime("17:30");
// $end = strtotime("05:30") + 3600*24; // the work ended at 05:30 morning of the next day
$morning_start = strtotime("07:00");
$morning_end = strtotime("15:00");
$afternoon_start = strtotime("15:00");
$afternoon_end = strtotime("23:00");
$night_start = strtotime("23:00");
$night_end = strtotime("07:00") + 3600*24; // 07:00 of next day, add 3600*24 seconds
echo "morning: " . intersection( $start, $end, $morning_start, $morning_end ) / 3600 . " hours\n";
echo "afternoon: " . intersection( $start, $end, $afternoon_start, $afternoon_end ) / 3600 . " hours\n";
echo "night: " . intersection( $start, $end, $night_start, $night_end ) / 3600 . " hours\n";
我不是这段代码的作者。版权归用户Javi R所有,代码来自此问题:Calculating shift hours worked。我做了这个,因为原来的问题大约是3岁,他们不再回答那里了。
Javi R代码的工作方式几乎完美但有一些我找不到的bug。
我的轮班时间比较简单:22:00 - &gt; 07:00 =夜间工作,07:00 - &gt; 22:00 =日常工作。
我认为这些变化或其他方面并不重要。我也尝试使用原始代码,但bug仍然存在。
如果工作时间像22:30那样,我对Javi R版本的回答是错误的 - &gt; 08:00(结果:天= 0小时,夜晚= 8:30小时)和20:00 - &gt; 10:00(结果:天= 2小时,夜晚= 9小时)但正确回答工作时间如23:00 - &gt; 07:00(结果:天= 0小时,夜晚= 7小时)。
正确的将是:
22:30 - &gt; 08:00 =夜晚8,5小时和白天1小时 20:00 - &gt; 10:00 =夜间9小时,白天2 + 3小时
我希望你能解决我的问题和那个错误,这样代码就可以完美运行,并可以帮助其他人解决同样的问题。
感谢您帮助并感谢Javi R执行该代码。
答案 0 :(得分:0)
当工作时间超过一个工作日时出现问题。 在您的代码的情况下,一天从早上7点到早上7点(早上7点到15点,下午15点到22点,晚上22点> 7点)。 如果一个工作从晚上22点到早上8点,一个工作第一天10小时,第二天工作1小时。建议的代码没有考虑到这种溢出。
A(远程形式完美)修复可以更改函数intersection()
,如下所示:
function intersection($s1, $e1, $s2, $e2,$day) {
return subintersection($s1,$e1,$s2,$e2)+subintersection($s1,$e1,$s2+$day,$e2+$day);
}
function subintersection($s1, $e1, $s2, $e2) {
if ($e1 < $s2)
return 0;
if ($s1 > $e2)
return 0;
if ($s1 < $s2)
$s1 = $s2;
if ($e1 > $e2)
$e1 = $e2;
return $e1 - $s1;
}
并将您的来电更改为intersection()
。例如,早上:
$day=3600*24;
echo "morning: " . (intersection( $start, $end, $morning_start, $morning_end,$day))/3600 . " hours\n<br/>"