【发布时间】:2014-07-22 09:48:10
【问题描述】:
我对 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 代码几乎可以完美运行,但有一些我找不到的错误。
我的轮班时间更简单:22:00 -> 07:00 = 夜间工作,07:00 -> 22:00 = 白天工作。
我认为这些转变或其他东西的方式并不重要。我也尝试过使用原始代码,但仍然存在错误。
如果工作时间是 22:30 -> 08:00(结果:白天 = 0 小时,晚上 = 8:30 小时)和 20:00 -> 10:00(结果:白天 = 2 小时,夜晚 = 9 小时),但正确答案的工作时间为 23:00 -> 07:00(结果:白天 = 0 小时,夜晚 = 7 小时)。
正确的是:
22:30 -> 08:00 = 夜间 8.5 小时和白天 1 小时 20:00 -> 10:00 = 夜间 9 小时和白天 2 + 3 小时
我希望您能够解决我的问题和那个错误,以便代码能够完美运行并可以帮助其他有同样问题的人。
感谢您的帮助并感谢 Javi R 编写该代码。
【问题讨论】:
-
我遇到了同样的问题。你能帮助我吗? enter link description here
标签: php time clock strtotime shift