PHP使用循环生成近12个月出现三月重复的问题如何解决?
解决PHP循环获取过去12个月出现重复月份的问题
这个问题我之前也碰到过!根源在于strtotime处理相对日期时的自动调整机制:当你从一个**大日期(比如30号、31号)**减去月份时,如果目标月份没有对应日期,PHP会自动把日期向后顺延到下一个月的有效日期。比如你运行代码时的当前日期是2020年1月30号,计算now -11 month时,会试图生成2019年2月30号——但2019年2月只有28天,这个无效日期就被自动调整成了2019年3月2号,结果就出现了两次三月。
方法1:固定锚定每月第一天
把日期锚定到每个月的第一天,就能避免大日期导致的自动跳转问题:
for ($i = 0; $i < 12; $i++) { // 先获取当月第一天,再减去对应月份数 $month = date("d/m/Y", strtotime(date('Y-m-01') . " -$i month")); echo "$month<br>"; }
方法2:用DateTime类(更可靠推荐)
DateTime类的日期处理逻辑更清晰,也更易维护,个人更推荐这种方式:
$date = new DateTime('first day of this month'); for ($i = 0; $i < 12; $i++) { echo $date->format('d/m/Y') . "<br>"; $date->modify('-1 month'); }
如果需要获取每个月的最后一天,只需要把first day of this month改成last day of this month就行,同样不会出现重复月份的问题。
内容的提问来源于stack exchange,提问作者Jefferson Hillebrecht
相关产品推荐
相关产品推荐

