如何将分钟合并到时间段

How to combine minutes to a timeblock

在后台运行一个脚本来检查某人是否有空。该脚本然后在数据库中插入一个值。我无法控制这个脚本。输出如下:

12:01:00
12:02:00
12:03:00
12:10:00
12:11:00
12:12:00
12:13:00
12:14:00
12:15:00

等等

现在我需要使用 PHP 对这些数据进行分组,这样我将得到连续行的第一个和最后一个数据。所以在这种情况下,我需要的数据是:

12:01:00
12:03:00
12:10:00
12:15:00

我已经搜索过这个论坛和谷歌,但也许我的英语不够好,找不到答案。我尝试了各种想法(比如将时间与之前的时间进行比较,但每次我都遇到意外或无效的结果)。

  1. 读取时间字符串并将其设置为时间段的开始和结束。
  2. 读取下一个时间字符串。
  3. 计算时间串的差值,如果小于00:01:00则延长时间段。如果超过 1 分钟,则打印时间段并开始新的时间段。转到 2.

当你使用mtkime()和date()时,你应该调用

date_default_timezone_set('UTC');

以下是代码示例。数据以字符串形式存储在数组中。

date_default_timezone_set('UTC');

$arr = array(
    '12:01:00',
    '12:02:00',
    '12:03:00',
    '12:10:00',
    '12:11:00',
    '12:12:00',
    '12:13:00',
    '12:14:00',
    '12:15:00'
);

// Start of code sample
$firsttime = true;
$start_time = '';
$end_time = '';
foreach ($arr as $time) {
    if ($firsttime === true) {  // start of a new time range
        // above test can be changed to $start_time === '' && $end_time === ''
        $firsttime = false;
        $start_time = $time;
        $end_time = $time;
    } else {
        $diff = diff_time($end_time, $time);
        // insert error check here
        if ($diff <= '00:01:00') {  // consecutive
            $end_time = $time;  // update end of the time range
        } else {    // end of the time range
            echo $start_time, '<br />';
            echo $end_time, '<br />';
            $start_time = $time;
            $end_time = $time;
        }
    }
}
if ($start_time !== '' && $end_time !== '') {
    echo $start_time, '<br />';
    echo $end_time, '<br />';
}
echo 'End<hr />';

function diff_time($from_time, $to_time) {
    if (preg_match('/([0-9]+):([0-9]+):([0-9]+)/', $from_time, $captured)) {
        $from = mktime($captured[1], $captured[2], $captured[3], 1, 1, 2000);
    } else {
        return false;
    }
    if (preg_match('/([0-9]+):([0-9]+):([0-9]+)/', $to_time, $captured)) {
        $to = mktime($captured[1], $captured[2], $captured[3], 1, 1, 2000);
    } else {
        return false;
    }
    if ($from > $to) {
        return date('-H:i:s', $from - $to);
    } else {
        return date('H:i:s', $to - $from);
    }