【问题标题】:PHP: Get difference between two DateTime objects in Hours, Minutes, and SecondsPHP:以小时、分钟和秒为单位获取两个 DateTime 对象之间的差异
【发布时间】:2016-09-30 15:44:15
【问题描述】:

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

【问题讨论】:

  • 您必须手动进行计算。这解释了如何在几分钟内完成,这离你想要的不太远stackoverflow.com/questions/16776061/…
  • 为了更清楚地解释问题,以便获得更好的答案:您只想拥有HH:MM:SS 还是可以在前几天添加前缀?如DD HH:MM:SS?

标签: php datetime


【解决方案1】:

按照 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
);

【讨论】:

  • 天哪,我从没想过会这样。很美丽!谢谢!
  • 不客气,可以做成单行本,这样分享,方便阅读。
  • 我更喜欢可读性而不是行号;)它就是这样完美的。
  • 唯一的问题是它不会工作超过一个月。可能值得改为使用$interval->days * 24...以防万一有人忘记注销并在度假时离开。
  • ->d 最多为 31,因为它将滚动到几个月并重置,->days 将始终是总天数
【解决方案2】:

我更喜欢使用 \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");
}

【讨论】:

  • 这会起作用,但这不是我在原始问题中要问的。 (+1 无论如何都是为了帮助)我需要将该天数转换为小时数(乘以 24)并将其添加到 date_diff() 返回的小时数中。有什么想法吗?
  • 请注意,使用[interval]->format() 时,用于格式化输出的字符与格式化常规日期时的常用字符不同。例如。如果你想要前导零,请使用%H:%I:%S
【解决方案3】:

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

【讨论】:

  • 这很好,很优雅。我喜欢。但是我怎样才能将天数乘以 24,然后将其添加到小时数上呢?这似乎变得非常复杂......
猜你喜欢
  • 2018-11-25
  • 2021-05-14
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
相关资源
最近更新 更多