1

我有一个 PHP 脚本,它从数据库中接收一组带有开始/结束日期时间的事件,它们代表工作时间。

Begin               | End
2013-08-14 10:00:00 | 2013-08-22 09:30:00
2013-08-08 07:00:00 | 2013-08-08 15:00:00
2013-08-09 07:00:00 | 2013-08-10 07:00:00

现在我想计算每天工作了多少。对于第一行,我想要这样的输出:

Begin               | End
2013-08-14 10:00:00 | 2013-08-14 23:59:59
2013-08-15 00:00:00 | 2013-08-15 23:59:59
2013-08-16 00:00:00 | 2013-08-16 23:59:59
....
2013-08-22 00:00:00 | 2013-08-22 09:30:00

我已经看到了一些关于 DatePeriod 和 DateInterval 的东西,但这些都没有考虑到时间。

谢谢你的帮助。

4

2 回答 2

6

DatePeriodDateInterval确实会考虑时间,因此您可以使用这些类。

您的数据:

$intervals = [
    ['begin' => '2013-08-14 10:00:00', 'end' => '2013-08-22 09:30:00'],
    ['begin' => '2013-08-08 07:00:00', 'end' => '2013-08-08 15:00:00'],
    ['begin' => '2013-08-09 07:00:00', 'end' => '2013-08-10 07:00:00'],
];

我写的快速功能:

function explodePeriodByDays($begin, $end) {
    $days = [];
    $dayInterval = new DateInterval('P1D');
    $begin = new DateTime($begin);
    $end = new DateTime($end);
    $_end = clone $end; 
    $_end->modify('+1 day');
    foreach ((new DatePeriod($begin, $dayInterval, $_end)) as $i => $period) {
        $_begin = $period;
        if ($i) $_begin->setTime(0, 0, 0);
        if ($_begin > $end) break;
        $_end = clone $_begin;
        $_end->setTime(23, 59, 59);
        if ($end < $_end) $_end = $end;
        $days[] = [
            'begin' => $_begin,
            'end' => $_end,
        ];
    }
    return $days;
}

函数使用示例:

foreach ($intervals as $interval) {
    echo "Day intervals from {$interval['begin']} to {$interval['end']} : \n";
    foreach (explodePeriodByDays($interval['begin'], $interval['end']) as $day) {
        echo "\t {$day['begin']->format('Y-m-d H:i:s')} | {$day['end']->format('Y-m-d H:i:s')}\n";
    }
    echo "\n";
}

示例的输出:

Day intervals from 2013-08-14 10:00:00 to 2013-08-22 09:30:00 : 
     2013-08-14 10:00:00 | 2013-08-14 23:59:59
     2013-08-15 00:00:00 | 2013-08-15 23:59:59
     2013-08-16 00:00:00 | 2013-08-16 23:59:59
     2013-08-17 00:00:00 | 2013-08-17 23:59:59
     2013-08-18 00:00:00 | 2013-08-18 23:59:59
     2013-08-19 00:00:00 | 2013-08-19 23:59:59
     2013-08-20 00:00:00 | 2013-08-20 23:59:59
     2013-08-21 00:00:00 | 2013-08-21 23:59:59
     2013-08-22 00:00:00 | 2013-08-22 09:30:00

Day intervals from 2013-08-08 07:00:00 to 2013-08-08 15:00:00 : 
     2013-08-08 07:00:00 | 2013-08-08 15:00:00

Day intervals from 2013-08-09 07:00:00 to 2013-08-10 07:00:00 : 
     2013-08-09 07:00:00 | 2013-08-09 23:59:59
     2013-08-10 00:00:00 | 2013-08-10 07:00:00
于 2013-08-09T14:20:40.550 回答
0

如果我理解正确,您想了解开始日期和结束日期之间的区别。

我会用 strtotime 转换时间,减去时间戳,然后输出日期。

$begin = strtotime("2013-08-14 10:00:00");
$end   = strtotime("2013-08-14 23:59:59");

$difference = ($end - $begin);

echo gmdate("H:i:s", $difference);

这将为您提供以小时、分钟和秒为单位的时间。

于 2013-08-09T13:24:10.793 回答