我正在尝试计算一个人在某一天工作的小时数。为此,我需要以小时,分钟和秒为单位来区分两个DateTime对象。到目前为止,我可以成功地这样做
$timeIn = new DateTime($time['timeIn']);
$timeOut = new DateTime($time['timeOut']);
$time['hours'] = date_diff($timeIn, $timeOut) -> format("%H:%i:%s");
这似乎工作正常,直到我输入一个员工忘记退出的测试用例。现在,让我们说
$timeIn = '2016-09-28 14:26:17'
$timeOut = '2016-09-30 09:53:53'
在这种情况下,差异应该是43:27:36(因为timeIn和timeOut之间有一天多的时间)。相反,我得到19:27:36(就好像它只是截断休息日并返回其余部分)。如何将这一天添加到小时而不是截断它? (我希望得到43:27:36,而不是1天,19个小时等等。所以我想在HH中得到答案:MM:SS)
答案 0 :(得分:5)
正如斯科特建议的那样,但我们需要对其进行调整,但我们需要很好的sprintf
才能提供帮助:
$start = new \DateTime("2016-09-28 14:26:17");
$end = new \DateTime("2016-09-30 09:53:53");
$interval = $end->diff($start);
$time = sprintf(
'%d:%02d:%02d',
($interval->d * 24) + $interval->h,
$interval->i,
$interval->s
);
答案 1 :(得分:4)
我更喜欢使用\DateTime
个对象 - 尽管最终不应该有很大差异date_diff
只是\DateTime::diff
的别名。
您想要检查DateInterval
对象中的天数;
$start = new \DateTime("2016-09-28 14:26:17");
$end = new \DateTime("2016-09-30 09:53:53");
$interval = $end->diff($start);
$days = $interval->d;
if ($days > 0) {
echo $interval->format("%a %h:%i:%s\n");
} else {
echo $interval->format("%h:%i:%s\n");
}
答案 2 :(得分:1)
date_diff()
返回DateInterval实例。查看DateInterval::format方法或DateInterval::days字段。小时,分钟和秒值是指最后一天的余数(如果不止一个)。您正在寻找a
总天数。
$timeIn = new DateTime($time['timeIn']);
$timeOut = new DateTime($time['timeOut']);
$diff = date_diff($timeIn, $timeOut) -> format("%H:%i:%s");
$days = $diff->days;
$time['hours'] = // calculate based on days + remainder...