首页 > 解决方案 > 使用 foreach 循环添加 DateTime 间隔

问题描述

昨天我在将日期时间间隔加在一起时问了一个问题,并被指向这个线程-我们如何在 PHP 中添加两个日期间隔

这很棒而且很有意义。但是,当我尝试foreach循环执行提交的答案时,我得到的结果不正确。

这是我制作的一个函数,它可以获取员工的所有时间和时间,它们存储在数据库中并使用 PHP 的日期(H:i:s)创建。

我的功能获取任何给定员工的所有进出时间,我正在处理的报告功能需要显示他们工作的总小时数。

我试图通过将时间转换为 datetime 对象并使用 ->diff 来获取间隔并因此计算该天的小时数来实现这一点,然后我尝试使用foreach循环将间隔相加在一起,从而给我工作时间的总和在任何给定的日期范围内。

整个功能是这样的:

function getTotalHours($staff_id,$from_date,$to_date){

    $sql = "SELECT * FROM oc_staff_times WHERE date BETWEEN '$from_date' AND '$to_date' AND staff_id = '$staff_id'";
    $result = $this->conn->query($sql);

    if ($result->num_rows > 0) {
        while ($row = mysqli_fetch_assoc($result)) {
            $data[] = $row;
        }

        $base_time = new DateTime('00:00');
        $total = new DateTime('00:00');

        foreach ($data as $time) {
            $in = new DateTime($time['clock_in_time']); 
            $out = new DateTime($time['clock_out_time']); 
            $interval = $in->diff($out);
            $base_time->add($interval); 
        }

        return $total->diff($base_time)->format("%H:%I");       
    }
}

我希望得到一个每月的总数,但是我的最终结果似乎只有一天。这是 UI 的屏幕截图(总小时数被粗略圈出),这也显示了我的函数应该添加在一起的时间戳。

1

标签: phpmysqlmysqli

解决方案


Qirel 的答案提供了一种在 SQL 中执行此操作的好方法,但是如果您想了解为什么您的代码不起作用:

$base_time = new DateTime('00:00');不创建间隔,它是一个日期。这意味着如果您添加 24 小时并仅询问时间部分,它将显示“00:00”,因为您在第二天结束。

一种解决方案是声明$base_time为间隔,例如: $base_time = new DateInterval('PT0S');

最后直接输出如下: $base_time->format("%H:%I");


推荐阅读