我必须找到一个员工的生产时间,他花了多少小时和分钟来完成这个项目。
我的情况是,
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.
以上所有条件都应该达到。我试图实现这一点,但在一天的工作中,代码工作得很好。但对于超过一天的休息,这只减去一次,而工作时间没有减去。
$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。
如何实现我的条件和输出?我真的被困在这里了。谁能帮帮我。谢谢。
发布于 2018-03-06 22:53:23
根据你的条件4,“工作时间在08:30到18:30之间,超过这个工作时间的时间应该减去。”但是你的开始日期应该是$start = "01-01-2018 09:00";,我认为应该是$start = "01-01-2018 08:30";,而你的休息时间,即break4_..应该是:
$break4_start = "18:30";
$break4_end = "08:30";我以分钟为单位计算总工作时间和休息时间,稍后将以小时和分钟为单位进行更改。
根据这些假设,我尝试计算总工作小时数和分钟数。
$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;https://stackoverflow.com/questions/49093024
复制相似问题