我正在尝试计算每位员工每天的总工作时间,包括数据、进入时间、午餐时间、用餐完成时间和离开时间。像这样留下这些数据:
入住时间:上午 08:00:00
午餐:01:00:00 PM
午餐结束:01:45:00 PM
工作输出:05:00:00 PM
要计算一天的工作时间,我想获得开始时间和午餐时间之间的差,然后是午餐结束时间(即他回到工作岗位的时间)与一天的结束时间之间的差。工作,我通过以下方式完成了这项工作:
function HorasTrabajadas($h1,$h2,$h3,$h4){
$horalogin = new DateTime($h1);
$horalunchstart = new DateTime($h2);
$horalunchend = new DateTime($h3);
$horalogout = new DateTime($h4);
$diferencia1 = $horalogin->diff($horalunchstart);
$diferencia2 = $horalunchend->diff($horalogout);
$hora1 = $diferencia1->format('%H');
$hora2 = $diferencia2->format('%H');
$horas = $hora1+$hora2;
return $horas . ' hours';
}
问题是它错误地返回了差异,例如从上午 8 点到下午 1 点它返回 7。它必须返回 5,因为有 5 小时的差异。我不知道为什么这会发生在我身上,我已经搜索并尝试了其他方式但没有成功。顺便说一下,数据库字段是时间类型的。
我以这种方式将数据传递给函数
if ($key['login'] != '00:00:00' and $key['lunch_start'] != '00:00:00' and $key['lunch_end'] != '00:00:00' and $key['logout']!='00:00:00') {
$horas = HorasTrabajadas($key['login'],$key['lunch_start'],$key['lunch_end'],$key['logout']);
$form = true;
} else {
$horas = 'The day is not complete';
$form = false;
}
每个数据都是从数据库中获取的,每个字段都是时间类型的,并且以这种格式存储 hh:ii:ss 不用多说。在将它们带入查询时,我在遍历查询返回的数组后打印它们,打印它们的方式是这样的:
<?php echo $key['login'] . ' AM'; ?>
以此类推。我已经完成了每个字段的回显,它显示它们是这样的:
Alejo,根据您提供的数据:
工人总共工作了8小时15分钟。
进行计算的一种方法是以秒为单位的差异,获取对象的时间戳。
看看这段代码......在评论中我展示了我上面所说的内容。
正如您在问题中提出的那样,我还依赖于
DateTime::createFromFormat('H:i A', $h1)
创建日期对象。这可能会有所不同,具体取决于数据在数据库中的存储方式。结果: