由于当前月/年是2012年1月,为什么以下代码将在2011年12月而不是2011年11月返回?
echo date("F Y", strtotime("-2 months"));
如果有所不同,这是在PHP 5.3.0上。
答案 0 :(得分:12)
要获得您想要的内容,您可以使用这个相当冗长的版本:
echo date("F Y", strtotime("first day of this month - 2 months"));
此处详细介绍了原始版本的问题:http://derickrethans.nl/obtaining-the-next-month-in-php.html。引用如下:
一遍又一遍的PHP用户抱怨下个月用PHP date-string解析器不会转到下个月,而是跳到 下个月之后;如下例所示:
<?php $d = new DateTime( '2010-01-31' ); $d->modify( 'next month' ); echo $d->format( 'F' ), "\n"; ?>
小脚本的输出将是March。三月显然没有 跟随1月,因为二月介于两者之间。但是,目前 行为是正确的。内部发生以下情况:
下个月将月份数量(原来为1)增加一个。这个 发布日期2010-02-31。第二个月(二月)只有28个 在2010年的几天,所以PHP通过继续计数自动纠正这一点 从2月1日开始的几天然后你在3月3日结束。格式化 剥离一年又一天,导致产量三月。这个可以 使用完整日期格式回显日期时很容易看到 将于2010年3月3日输出:
这是为了增加月份,但在减去月份时反向相同;没有11月31日,因此strtotime方法将其“纠正”到12月1日。