PHP日期遍历while循环仅运行3天提前终止问题排查
问题原因
- 循环提前终止的核心错误是直接使用格式化后的日期字符串做大小比较:PHP对字符串做大小比较时是逐字符比对ASCII码,并非按照实际时间先后判断。
- 你设置的结束时间字符串为
1/30/2015 5:00:00 PM,前3个字符固定为1/3;循环递增到1月4日时,$t的值为1/4/2015 10:00:00 AM,前3个字符为1/4,逐位比对到第3个字符时,4的ASCII码大于3,PHP直接判定$t > $rtt,循环立刻终止,最终只会生成1、2、3号共3条记录,和实际运行现象完全一致。 - 原代码循环中反复调用
strtotime解析字符串做时间计算,既存在格式解析歧义风险,也有不必要的性能损耗。
修复方案
全程使用Unix时间戳作为循环的计算、判断依据,仅在最终生成时间段键值时做日期格式化,从根源避免字符串比较的逻辑错误,修复代码如下:
$rtf = "1/1/2015 10:00:00 AM"; // 起始时间 $rtt = "1/30/2015 5:00:00 PM"; // 结束时间 $atArr = []; // 可用时间段数组 // 预解析起止时间为时间戳,避免循环内重复转换 $currentTs = strtotime($rtf); $endTs = strtotime($rtt); while ($currentTs <= $endTs) { // 直接用时间戳格式化早晚时间段,手动拼接AM/PM容易引入多余空格 $atArr[date('n/j/Y 8:00:00 A', $currentTs)] = date('n/j/Y 5:00:00 A', $currentTs); // 按天递增时间戳,夏令时场景可替换为 $currentTs = strtotime('+1 day', $currentTs); $currentTs += 24 * 60 * 60; } echo "<br><br> --------- TIMES ARRAY INIT --------- <br>"; var_dump($atArr);
注意:如果业务运行区域存在夏令时切换规则,不要直接累加86400秒(一天的秒数),请使用
strtotime('+1 day', $currentTs)做时间递增,避免夏令时当天时间偏移1小时导致的逻辑错误。
内容的提问来源于stack exchange,提问作者Muhammad Khalil Raza
相关产品推荐
相关产品推荐

