You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于时间间隔分组DateTime对象,开发演出连续日期分组程序

按时间间隔分组DateTime数组&提取表演者到访演出集合

嘿,我来帮你搞定这两个任务,先把需求理清楚,再给你实打实的实现思路和代码示例:

需求拆解

咱们要完成两个核心目标:

  1. 将给定的DateTime对象集合,按它们之间的时间间隔整理成二维数组分组
  2. 从演出数据中提取指定表演者的全部场次,把连续日期举办的演出归为一组,这类组就定义为「到访(visits)」

先给你看看你提到的DateTime对象子集示例:

Array (
    [0] => DateTime Object (
        [date] => 2017-04-22 12:45:49.000000
        [timezone_type] => 3
        [timezone] => America/Denver
    )
    [1] => DateTime Object (
        [date] => 2017-04-21 12:45:49.000000
        [timezone_type] => 3
        [timezone] => America/Denver
    )
    // 更多DateTime对象...
)

具体实现(PHP版本)

1. 按时间间隔分组DateTime数组

这里默认以**1天(24小时)**为间隔阈值,你可以随时调整。核心逻辑是先排序,再逐个对比时间差:

function groupDateTimeByInterval(array $dateTimes, int $intervalHours = 24): array {
    // 先把所有DateTime按时间从小到大排序
    usort($dateTimes, function($a, $b) {
        return $a->getTimestamp() - $b->getTimestamp();
    });

    $groups = [];
    $currentGroup = [$dateTimes[0]]; // 初始化第一个分组

    for ($i = 1; $i < count($dateTimes); $i++) {
        $lastInGroup = end($currentGroup);
        $timeDiff = $dateTimes[$i]->diff($lastInGroup);
        // 将天数和小时转换为总小时数
        $totalHours = ($timeDiff->days * 24) + $timeDiff->h;

        // 间隔符合阈值则加入当前组,否则新建分组
        if ($totalHours <= $intervalHours) {
            $currentGroup[] = $dateTimes[$i];
        } else {
            $groups[] = $currentGroup;
            $currentGroup = [$dateTimes[$i]];
        }
    }
    // 把最后一个分组加入结果
    $groups[] = $currentGroup;

    return $groups;
}

2. 提取指定表演者的到访演出集合

假设你的演出数据结构包含performer(表演者名称)和date(演出日期DateTime)字段,实现代码如下:

function getPerformerVisits(array $performances, string $targetPerformer): array {
    // 筛选出指定表演者的所有演出
    $performerShows = array_filter($performances, function($show) use ($targetPerformer) {
        return $show['performer'] === $targetPerformer;
    });

    // 按演出日期排序
    usort($performerShows, function($a, $b) {
        return $a['date']->getTimestamp() - $b['date']->getTimestamp();
    });

    $visits = [];
    $currentVisit = [$performerShows[0]];

    for ($i = 1; $i < count($performerShows); $i++) {
        $prevShowDate = end($currentVisit)['date'];
        $currentShowDate = $performerShows[$i]['date'];
        // 只比较日期部分,忽略具体时分秒
        $dayDiff = $currentShowDate->diff($prevShowDate)->days;

        // 间隔1天以内(含同一天)的演出归为同一次到访
        if ($dayDiff <= 1) {
            $currentVisit[] = $performerShows[$i];
        } else {
            $visits[] = $currentVisit;
            $currentVisit = [$performerShows[$i]];
        }
    }
    $visits[] = $currentVisit;

    return $visits;
}

小提示

  • 时间间隔分组中,你可以修改$intervalHours参数调整分组标准,比如设为48就是按2天间隔分组
  • 如果到访分组需要严格按24小时(而非自然日)判断,可将日期差计算改为用时间戳统计总小时数

内容的提问来源于stack exchange,提问作者WA Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:57:43