首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据开始时间和结束时间查找生产时间php

根据开始时间和结束时间查找生产时间php
EN

Stack Overflow用户
提问于 2018-03-04 15:25:00
回答 1查看 870关注 0票数 2

我必须找到一个员工的生产时间,他花了多少小时和分钟来完成这个项目。

我的情况是,

1. I have start and end datetime of an employee

2. I have 3 break time.

3. The break times should be subtracted if break times is in between start and end time.

4. The working time is between 08:30 to 18:30, the time beyond this working time should be subtracted.

以上所有条件都应该达到。我试图实现这一点,但在一天的工作中,代码工作得很好。但对于超过一天的休息,这只减去一次,而工作时间没有减去。

代码语言:javascript
复制
$start = "01-01-2018 09:00";
$end = "02-01-2018 18:30";

$break1_start = "11:00";
$break1_end = "11:15";

$break2_start = "13:00";
$break2_end = "13:30";

$break3_start = "16:00";
$break3_end = "16:15";

//work time
$break4_start = "18:30";
$break4_end = "08:30";

$break1 = 0;
$break2 = 0;
$break3 = 0;
$break4 = 0;

//Break 1
if($break1_start >= date("H:i", strtotime($start)) and $break1_start <= date("H:i", strtotime($end))) {
    if($break1_end >= date("H:i", strtotime($start)) and $break1_end <= date("H:i", strtotime($end))) {
        $break1 = strtotime($break1_end) - strtotime($break1_start);
    }
    else {
        $end = date("H:i", strtotime($end));
        $break1 = strtotime($break1_end) - strtotime($end);
    }
}
else if($break1_end >= date("H:i", strtotime($start)) and $break1_end <= date("H:i", strtotime($end))) {
    $start = date("H:i", strtotime($start));
    $break1 = strtotime($break1_end) - strtotime($start);
}

//Break 2
if($break2_start >= date("H:i", strtotime($start)) and $break2_start <= date("H:i", strtotime($end))) {
    if($break2_end >= date("H:i", strtotime($start)) and $break2_end <= date("H:i", strtotime($end))) {
        $break2 = strtotime($break2_end) - strtotime($break2_start);
    }
    else {
        $end = date("H:i", strtotime($end));
        $break2 = strtotime($break2_end) - strtotime($end);
    }
}
else if($break2_end >= date("H:i", strtotime($start)) and $break2_end <= date("H:i", strtotime($end))) {
    $start = date("H:i", strtotime($start));
    $break2 = strtotime($break2_end) - strtotime($start);
}

//Break 3
if($break3_start >= date("H:i", strtotime($start)) and $break3_start <= date("H:i", strtotime($end))) {
    if($break3_end >= date("H:i", strtotime($start)) and $break3_end <= date("H:i", strtotime($end))) {
        $break3 = strtotime($break3_end) - strtotime($break3_start);
    }
    else {
        $end = date("H:i", strtotime($end));
        $break3 = strtotime($break3_end) - strtotime($end);
    }
}
else if($break3_end >= date("H:i", strtotime($start)) and $break3_end <= date("H:i", strtotime($end))) {
    $start = date("H:i", strtotime($start));
    $break3 = strtotime($break3_end) - strtotime($start);
}

//Work time
if($break4_start >= date("H:i", strtotime($start)) and $break4_start <= date("H:i", strtotime($end))) {
    if($break4_end >= date("H:i", strtotime($start)) and $break4_end <= date("H:i", strtotime($end))) {
        $break4 = strtotime($break4_end) - strtotime($break4_start);
    }
    else {
        $end = date("H:i", strtotime($end));
        $break4 = strtotime($break4_end) - strtotime($end);
    }
}
else if($break4_end >= date("H:i", strtotime($start)) and $break4_end <= date("H:i", strtotime($end))) {
    $start = date("H:i", strtotime($start));
    $break4 = strtotime($break4_end) - strtotime($start);
}

$diff = strtotime($end) - strtotime($start);
$diff = $diff - $break1 - $break2 - $break3 - $break4;

$hours = floor($diff / 3600);
$minutes = floor(($diff / 60) % 60);
$seconds = $diff % 60;

echo "$hours:$minutes:$seconds";

从上面的代码中,

1. All the break time should be subtracted twice because break time comes twice in the given start and end time.

上述给定开始和结束时间以及所有中断时间的output应为17:30:00

但是现在上面代码的输出是1458:30:0

如何实现我的条件和输出?我真的被困在这里了。谁能帮帮我。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-06 22:53:23

根据你的条件4,“工作时间在08:30到18:30之间,超过这个工作时间的时间应该减去。”但是你的开始日期应该是$start = "01-01-2018 09:00";,我认为应该是$start = "01-01-2018 08:30";,而你的休息时间,即break4_..应该是:

代码语言:javascript
复制
$break4_start = "18:30";
$break4_end = "08:30";

我以分钟为单位计算总工作时间和休息时间,稍后将以小时和分钟为单位进行更改。

根据这些假设,我尝试计算总工作小时数和分钟数。

代码语言:javascript
复制
$start = "01-01-2018 08:30";
$end = "01-01-2018 18:30";

$starti = strtotime($start);
$endi = strtotime($end);

$startDate = date('Y-m-d', $starti);
$nextDayDate = date('Y-m-d', strtotime($startDate. '+1 day'));

$break1_start = "11:00";
$break1_end = "11:15";

$break2_start = "13:00";
$break2_end = "13:30";

$break3_start = "16:00";
$break3_end = "16:15";

$break4_start = "18:30";
$break4_end = "08:30";

$datetime1 = new DateTime($start);
$datetime2 = new DateTime($end);
//get the difference of two dates
$interval = $datetime2->diff($datetime1);
//01-01-2018 to 02-01-2018, total working days will be 2 but `$interval->days` returns 1 so added one into this.

//01-01-2018 to 01-01-2018, diff function returns 0 so in that case it will count 1.

$totalDays = $interval->days + 1;
$totalBreak = 0;
//run a loop for total days to calculate total break times
for($i=0; $i < $totalDays; $i++){
    $break1_starti = strtotime(date('Y-m-d H:i:s', strtotime($startDate .$break1_start . ' +'.$i.' day')));
    $break1_endi = strtotime(date('Y-m-d H:i:s', strtotime($startDate .$break1_end . ' +'.$i.' day')));
    if($break1_starti >= $starti && $break1_endi <= $endi){
        $totalBreak += ($break1_endi - $break1_starti)/60;
    }
    $break2_starti = strtotime(date('Y-m-d H:i:s', strtotime($startDate .$break2_start . ' +'.$i.' day')));
    $break2_endi = strtotime(date('Y-m-d H:i:s', strtotime($startDate .$break2_end . ' +'.$i.' day')));
    if($break2_starti >= $starti && $break2_endi <= $endi){
        $totalBreak += ($break2_endi - $break2_starti)/60;
    }
    $break3_starti = strtotime(date('Y-m-d H:i:s', strtotime($startDate .$break3_start . ' +'.$i.' day')));
    $break3_endi = strtotime(date('Y-m-d H:i:s', strtotime($startDate .$break3_end . ' +'.$i.' day')));
    if($break3_starti >= $starti && $break3_endi <= $endi){
        $totalBreak += ($break3_endi - $break3_starti)/60;
    }
}

//now calculate day break
if($interval->days){
    $break4_starti = strtotime(date('Y-m-d H:i:s', strtotime($startDate .$break4_start)));
    $break4_endi = strtotime(date('Y-m-d H:i:s', strtotime($nextDayDate .$break4_end )));
    if($break4_starti >= $starti && $break4_endi <= $endi){
        $daysBreak = ($break4_endi - $break4_starti)/60;
    }
    $totalBreak += ($daysBreak * $interval->days);
}
echo "<br />totalBreak = ".$totalBreak;
echo "<br />totalMinutes = ".$totalMinutes = $minutsDiff = $interval->d * 24 * 60 + $interval->h * 60 + $interval->i;
echo "<br />totalWorkingMinutes = ".$totalWorkingMinutes = $totalMinutes - $totalBreak;
echo "<br />hours = ".$hours = floor($totalWorkingMinutes/60);
echo "<br />minutes = ".$minutes = $totalWorkingMinutes - $hours*60;
echo "<br />Total Working time = ". $hours.':'.$minutes;

DEMO

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49093024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档