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

PHP自定义日历动态页问题:strtotime+2周日期判断异常

问题分析与解决方案

先帮你拆解下问题的核心原因,再给你靠谱的解决思路:

为什么+2 weeks的判断会失效?

你当前用strtotime($days[$i].' +2 weeks')的逻辑是:先定位「当前周」的指定星期几,再往后加2周。以你给出的测试日期(2018-04-04,周三)为例:

  • Monday +2 weeks:先找到本周一(2018-04-02),加2周后得到2018-04-16
  • Friday +2 weeks:先找到本周五(2018-04-06),加2周后得到2018-04-20

看起来这俩日期在同一周,但如果你的$myvar是基于「两周后的当天所在周」来生成的,就会出现判断不匹配的情况——比如两周后的当天是2018-04-18(周三),它所在周的周五是2018-04-20,这时候周五的判断是对的,但如果你的逻辑预期是「从今天开始算第3周的完整周一到周五」,就会因为起始基准不一致导致后续判断失效。

正确的实现方式:统一基准周

应该先确定「两周后的目标周起始日」,再基于这个起始日推算整周的周一到周五,这样能保证所有日期都属于同一周,避免基准混乱。

方案1:用strtotime实现

$days = ['Monday','Tuesday','Wednesday','Thursday','Friday'];
// 先拿到两周后的周一的时间戳,作为基准
$targetWeekMonday = strtotime('Monday +2 weeks');

for ($i = 0; $i < count($days); $i++) {
    // 基于基准周一,依次加0-4天得到对应星期几的日期
    $targetDate = date('Y-m-d', strtotime("+$i days", $targetWeekMonday));
    // 执行你的判断逻辑
    if (date($myvar) == $targetDate) {
        // 这里写你的业务代码
        echo "匹配到".$days[$i].":".$targetDate."<br>";
    }
}

方案2:用DateTime类(更推荐,日期逻辑更清晰)

PHP的DateTime类能避免strtotime模糊语法带来的坑,可读性也更强:

$days = ['Monday','Tuesday','Wednesday','Thursday','Friday'];
$now = new DateTime();

// 先往后推2周
$now->add(new DateInterval('P2W'));
// 定位到两周后日期所在周的周一
$now->modify('Monday this week');

foreach ($days as $day) {
    // 克隆对象,避免修改原基准日期
    $targetDate = clone $now;
    $targetDate->modify($day);
    
    if ($myvar == $targetDate->format('Y-m-d')) {
        // 你的业务逻辑
        echo "匹配到".$day.":".$targetDate->format('Y-m-d')."<br>";
    }
    // 往后推一天,对应下一个星期几
    $now->add(new DateInterval('P1D'));
}

额外提醒

如果你的日历有自定义周起始(比如周日作为一周第一天),只需要把modify('Monday this week')改成modify('Sunday this week')即可,灵活性拉满。

内容的提问来源于stack exchange,提问作者Lean Pilar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:41:28