在PHP中如何遍历两个指定日期之间的所有日期?
错误原因
- 你代码中的
date()函数用法不符合规范:date()第一个参数必须是日期格式字符串,第二个才是可选的时间戳参数,直接传入日期字符串作为第一个参数无法得到正确的时间结果。 - 直接对日期格式的字符串执行
++自增运算时,PHP只会识别字符串末尾的年份数值做自增,因此输出结果只会逐年+1,无法实现按天递增的效果。
正确实现方案
方案1:使用DateTime类(推荐,PHP 5.3及以上版本支持)
通过内置的日期处理类实现,自动处理闰年、不同月份天数差异等边界问题,不会出现解析错误:
// 明确指定输入的日期格式为日/月/年,避免解析歧义 $startDate = DateTime::createFromFormat('d/m/Y', '01/01/2017'); $endDate = DateTime::createFromFormat('d/m/Y', '01/06/2017'); // 若需要包含结束日期,需要将结束日期向后偏移1天 $endDate->modify('+1 day'); // 按天遍历的间隔规则 $interval = new DateInterval('P1D'); $dateRange = new DatePeriod($startDate, $interval, $endDate); foreach ($dateRange as $currentDate) { // 输出要求的dd/mm/yyyy格式 echo $currentDate->format('d/m/Y') . "<br>"; }
方案2:使用strtotime实现(兼容低版本PHP)
如果使用的PHP版本低于5.3,可以用时间戳遍历的方式实现,需要注意日期解析的格式问题:
// strtotime解析带-分隔的dd/mm/yyyy格式不会有歧义,因此这里用-代替/作为分隔符 $startTimestamp = strtotime('01-01-2017'); $endTimestamp = strtotime('01-06-2017'); for ($current = $startTimestamp; $current <= $endTimestamp; $current = strtotime('+1 day', $current)) { echo date('d/m/Y', $current) . "<br>"; }
注意:strtotime()解析带/分隔的日期时会默认按月/日/年格式处理,要解析日/月/年格式的日期建议将分隔符替换为-,避免出现日期解析错误。
内容的提问来源于stack exchange,提问作者user16408295
相关产品推荐
相关产品推荐

