PHP:以小时,分钟和秒为单位获取两个DateTime对象之间的差异

时间:2016-09-30 15:44:16

标签: php datetime

我正在尝试计算一个人在某一天工作的小时数。为此,我需要以小时,分钟和秒为单位来区分两个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)

3 个答案:

答案 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...