PHP时间添加HH:MM:SS


PHP time add HH:MM:SS

我正试图为以下代码不适合我的7天工作周期间的员工添加总工作时间,不确定我做错了什么,因为我不是PHP专家,想法请?

<?php 
            $time1 = $row_Roster['sunday_start'];
            $time2 = $row_Roster['sunday_end'];
            list($hours, $minutes, $seconds) = explode(':', $time1);
            $startTimestamp = mktime($hours, $minutes, $seconds);
            list($hours, $minutes, $seconds) = explode(':', $time2);
            $endTimestamp = mktime($hours, $minutes, $seconds);
            $add = $endTimestamp - $startTimestamp;
            if($seconds < 0) {
            $seconds+=60*60*24; 
            }
            $seconds = $add % 60;
            $minutes = ($add / 60) % 60;
            $hours = floor($add / (60 * 60));

            $sunday = sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds);
            echo $sunday;
            if ($sunday >8)
            echo ('</br><span class="smallred">Long Shift</span>');
?>

有意义吗

    list($hours, $minutes, $seconds) = explode(':', $time1);
    $Timestamp1 = mktime($hours, $minutes, $seconds);
    list($hours, $minutes, $seconds) = explode(':', $time2);
    $Timestamp2 = mktime($hours, $minutes, $seconds);
    list($hours, $minutes, $seconds) = explode(':', $time3);
    $Timestamp3 = mktime($hours, $minutes, $seconds);
    list($hours, $minutes, $seconds) = explode(':', $time4);
    $Timestamp4 = mktime($hours, $minutes, $seconds);
    $add = $Timestamp1 + $Timestamp2 + $Timestamp3 + $Timestamp4;
    if($seconds < 0) {
        $seconds+=60*60*24; 
    }
    $seconds = $add % 60;
    $minutes = ($add / 60) % 60;
    $hours = floor($add / (60 * 60));
    $total = sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds);             
    echo $total;
?>

你这样做太复杂了。

首先将所有格式化的日期放入数组($formattedWorkTimeWeekdays)。

然后用array_map()逐日计算每天的总秒数,存于$secondsWorkTimeWeekdays

在此之后,您可以将每天的所有秒数与array_sum()相加,然后在变量$totalSecondsWorkTimeWeek中以秒为单位获得本周的总工作量。

最后简单地计算出小时、分钟和秒。

<?php
    $formattedWorkTimeWeekdays = [
            $monday,
            $tuesday,
            $wednesday,
            $thursday,
            $friday,
            $saturday,
            $sunday,
        ];
    $secondsWorkTimeWeekdays = array_map(function($formattedWorkTimeDay){
        list($hours, $minutes, $seconds) = explode(":", $formattedWorkTimeDay);
        return ($hours * 3600) + ($minutes * 60) + $seconds;
    }, $formattedWorkTimeWeekdays);
    $totalSecondsWorkTimeWeek = array_sum($secondsWorkTimeWeekdays);
    $hoursWorkTimeWeek = $totalSecondsWorkTimeWeek / 3600;
    $minutesWorkTimeWeek = ($totalSecondsWorkTimeWeek % 3600) / 60;
    $secondsWorkTimeWeek = ($totalSecondsWorkTimeWeek % 3600 % 60);
    echo $total = sprintf('%02d:%02d:%02d', $hoursWorkTimeWeek, $minutesWorkTimeWeek, $secondsWorkTimeWeek);
?>
编辑:

编辑后,你有两个完全不同的代码,它们彼此完全不相关。对于你的第一次修改,我给出了上面的答案。

现在在您编辑的代码中,您似乎只有2个日期。你可以创建两个DateTime对象并从中获取差异,例如

$workTimeStart = new DateTime($row_Roster['sunday_start']);
$workTimeEnd = new DateTime($row_Roster['sunday_end']);
$workTimeDifference = $workTimeStart->diff($workTimeEnd);
echo $workTimeDifference->format("%h hours %i minutes %s seconds");

您可以使用gmdate函数来代替计算和调用sprintf:

//the same code summing the weekdays seconds
$add = $Timestamp1 + $Timestamp2 + $Timestamp3 + $Timestamp4;
print gmdate("H:i:s", $add);