PHP循环递减日期异常:无法正确获取今日、昨日及历史日期
搞定这个连续日期循环的问题~
你的代码现在跑不起来主要是两个关键问题,我帮你拆解并修复:
1. date()函数参数使用错误
date()的第一个参数必须是日期格式字符串(比如"Y-m-d H:i:s"),但你把已经格式化好的日期字符串(比如"2024-05-20 00:00:00")塞进去当第一个参数了,这会让函数完全无法正确解析,自然输出异常。
2. 日期偏移逻辑错误
你用strtotime("-$i days")来计算前一天,但i是循环计数器,每次都会递增,结果就是第一次减1天,第二次减2天,第三次减3天… 日期直接跳着往后退,根本不是你要的「昨日、前日、大前日」连续序列。
修复后的可用代码
下面是两种修正方案,都能实现从今日开始,依次输出连续900天的过往日期范围:
方案1:用时间戳累加偏移量(性能更优)
// 先获取今日0点和23:59:59的时间戳 $todayStart = strtotime(date("Y-m-d 00:00:00")); $todayEnd = strtotime(date("Y-m-d 23:59:59")); $totalLoops = 900; $count = 0; while ($count < $totalLoops) { // 计算当前循环对应的日期偏移:count=0是今日,count=1是昨日,以此类推 $offsetSeconds = $count * 86400; // 1天=86400秒 $targetStart = date("Y-m-d 00:00:00", $todayStart - $offsetSeconds); $targetEnd = date("Y-m-d 23:59:59", $todayEnd - $offsetSeconds); // 输出结果,可根据需求调整格式 echo "第 " . ($count + 1) . " 次循环:<br>"; echo "日期范围:{$targetStart} 至 {$targetEnd}<br><br>"; $count++; }
方案2:用strtotime相对时间(写法更直观)
$totalLoops = 900; $count = 0; while ($count < $totalLoops) { // 根据循环次数生成相对时间:count=0对应今天,count>0对应往前推count天 $relativeDate = $count === 0 ? "today" : "-{$count} days"; $dateStart = date("Y-m-d 00:00:00", strtotime($relativeDate)); $dateEnd = date("Y-m-d 23:59:59", strtotime($relativeDate)); echo "第 " . ($count + 1) . " 次循环:<br>"; echo "起始时间:{$dateStart} | 结束时间:{$dateEnd}<br><br>"; $count++; }
关键改进说明
- 修正
date()函数用法:严格遵循函数参数规则,第一个参数传格式字符串,第二个参数传时间戳/相对时间,确保日期解析正确。 - 实现连续日期偏移:通过循环计数器
count累加,每次只往前推1天,保证日期是连续递减的「昨日、前日…」序列。 - 简化逻辑结构:每次循环先计算目标日期再输出,避免原代码中重复打印、变量混乱的问题,可读性更强。
内容的提问来源于stack exchange,提问作者user8280493
相关产品推荐
相关产品推荐

