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

4

我正在尝试计算一个人在某一天工作的小时数。为此,我需要获取两个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的格式获得答案)

1
你必须手动进行计算。这篇文章解释了如何在几分钟内完成,这与你想要的并不太远。https://dev59.com/6WQn5IYBdhLWcg3wg3WR - R. Chappell
1
为了更清晰地解释问题,以便获得更好的答案: 您只想要 HH:MM:SS 还是可以接受在前面加上天数,例如 DD HH:MM:SS - R. Chappell
3个回答

7

正如Scott所建议的,我们需要进行格式化,但是我们有方便的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
);

天啊,我从未想过这个。太棒了!谢谢! - Native Coder
1
不客气,这可以变成一行代码,我只是分享这样做可以更容易阅读。 - R. Chappell
2
唯一的问题是它不能在一个月内工作。最好改用$interval->days * 24,以防有人忘记注销并去度假。 - R. Chappell
1
“->d” 的最大值为31,因为它会滚动到月份并重置,“->days” 将始终是总天数。 - R. Chappell
好的,我明白你的意思。我想知道如果 $interval->days 返回 false 会发生什么...我要试着玩一下...编辑:当 $interval->days 返回 false 时不会出现任何问题。无论哪种方式都可以完美地工作。再次感谢 @R. Chappell - Native Coder
显示剩余2条评论

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");
}

这个方法可以行得通,但它并不是我在原问题中所问的。(无论如何还是感谢你的帮助)我需要将那些天数转换成小时数(乘以24),并且加上 date_diff() 返回的小时数。有什么想法吗? - Native Coder
请注意,当使用 [interval]->format() 时,用于格式化输出的字符与格式化常规日期时的常见用法不同。例如,如果您想要前导零,请使用 %H:%I:%S - matthias

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

1
这很漂亮和优雅。我喜欢它。但是我怎么能把天数乘以24,然后加到小时上呢?这似乎变得非常复杂... - Native Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接