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

PHP实现指定日期区间内周起止日期数组的生成方法求助

解决方案:生成日期区间内的每周起止数组

我懂你要的是把指定日期区间拆分成每周起止日期的关联数组,而不是把所有关键日期平铺成一维数组。你的现有代码已经抓到了正确的日期节点,但没把它们组合成你需要的结构。咱们来调整一下代码逻辑:

核心思路

  1. 先把字符串日期转换成DateTime对象,方便日期计算
  2. 循环计算每周的结束日期(默认是当周周日,但不能超过给定的总结束日期)
  3. 把每周的start和end配对成关联数组,存入结果数组
  4. 更新下一周的起始日期为当前周结束日的下一天(周一),直到起始日期超过总结束日期

完整代码示例

$startDate = "01.09.2021";
$endDate = "30.09.2021";

// 将字符串日期转换为DateTime对象,注意格式是d.m.Y
$currentStart = DateTime::createFromFormat('d.m.Y', $startDate);
$endDateTime = DateTime::createFromFormat('d.m.Y', $endDate);

$weeks = [];

while ($currentStart <= $endDateTime) {
    // 计算本周的结束日期:下一个周日
    $currentEnd = (clone $currentStart)->modify('next sunday');
    
    // 如果计算出的周日超过了总结束日期,就用总结束日期作为本周的终点
    if ($currentEnd > $endDateTime) {
        $currentEnd = clone $endDateTime;
    }
    
    // 将本周的起止日期存入结果数组
    $weeks[] = [
        'start' => $currentStart->format('d.m.Y'),
        'end' => $currentEnd->format('d.m.Y')
    ];
    
    // 更新下一周的起始日期为当前周结束日的下一天(周一)
    $currentStart->modify('next monday');
}

// 输出结果,和你预期的结构完全一致
print_r($weeks);

关键细节说明

  • 使用clone操作DateTime对象:因为DateTime是引用类型,直接修改会改变原对象,克隆可以避免这个问题
  • 边界处理:当最后一周的周日超过给定的结束日期时,自动用总结束日期作为本周终点,保证区间完整
  • 循环终止条件:当currentStart超过总结束日期时停止循环,不会生成无效的周区间

运行这段代码后,你就能得到和预期完全一致的$weeks数组啦。

内容的提问来源于stack exchange,提问作者Sergey Vorobev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:12:35