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

PHP日期处理脚本在W3School运行正常 自有站点仅输出12求助

问题根因分析

站点返回12说明getWeekdays2m函数执行到了$b==1的分支,输出了函数内的echo "1"和echo "2",但后续foreach遍历完全没有执行,证明你返回的DatePeriod对象为空没有可遍历元素,核心原因有两个:

  • 站点PHP未正确配置时区,导致DateTime构造失败,无法正确解析first monday of Y-m这类相对时间表达式
  • 代码未处理月份进位逻辑,且部分低版本PHP对相对时间表达式的解析兼容性差,last day of $y-$m计算可能出现偏差,导致DatePeriod的结束时间早于开始时间,没有可遍历的日期

修复方案

第一步:强制配置时区(必须加在代码最顶部)

先解决时区异常问题,国内站点可统一设置为上海时区:

date_default_timezone_set('Asia/Shanghai');

第二步:优化日期计算逻辑

调整后的完整可运行代码如下,新增了月份进位处理、时间边界修正,避免解析异常:

<?php
date_default_timezone_set('Asia/Shanghai');
$stringweekday = "";

function getWeekdays2m($y, $m) {
    $b = 1;
    // 处理月份进位,避免12月+1变成13的异常
    $targetMonth = strtotime("$y-$m +$b month");
    $targetY = date('Y', $targetMonth);
    $targetM = date('m', $targetMonth);

    $Day_of_class = "monday";
    // 明确构造目标月的第一个周一
    $firstDay = new DateTime("first $Day_of_class of $targetY-$targetM");
    // 明确构造目标月最后一天的23:59:59,避免时间边界问题
    $lastDay = new DateTime("last day of $targetY-$targetM 23:59:59");

    if ($b == 1) {
        return new DatePeriod($firstDay, DateInterval::createFromDateString('+1 week'), $lastDay);
    } else {
        $nextLastDay = new DateTime("last day of $targetY-$targetM +1 month 23:59:59");
        return new DatePeriod($firstDay, DateInterval::createFromDateString('+1 week'), $nextLastDay);
    }
}

foreach (getWeekdays2m(date("Y"), date("m")) as $weekday) {
    if ($stringweekday == "") {
        $stringweekday = $weekday->format("d/m/Y");
    } else {
        $stringweekday .= ",".$weekday->format("d/m/Y");
    }
}
echo $stringweekday;
?>

可选调试方案

如果修改后仍有问题,可在函数返回DatePeriod前添加一行调试代码,确认时间范围是否符合预期:

var_dump($firstDay->format('Y-m-d'), $lastDay->format('Y-m-d'));

内容的提问来源于stack exchange,提问作者Eric Chong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:24:06