PHP自定义日历动态页问题:strtotime+2周日期判断异常
问题分析与解决方案
先帮你拆解下问题的核心原因,再给你靠谱的解决思路:
为什么+2 weeks的判断会失效?
你当前用strtotime($days[$i].' +2 weeks')的逻辑是:先定位「当前周」的指定星期几,再往后加2周。以你给出的测试日期(2018-04-04,周三)为例:
Monday +2 weeks:先找到本周一(2018-04-02),加2周后得到2018-04-16Friday +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
相关产品推荐
相关产品推荐

