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
相关产品推荐
相关产品推荐

