PHP中的工作班次代码错误

时间:2014-07-22 09:48:11

标签: php time clock strtotime shift

我对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执行该代码。

1 个答案:

答案 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/>"