PHP strtotime()没有返回正确的月份

时间:2012-01-31 21:49:52

标签: php

由于当前月/年是2012年1月,为什么以下代码将在2011年12月而不是2011年11月返回?

echo date("F Y", strtotime("-2 months"));

如果有所不同,这是在PHP 5.3.0上。

1 个答案:

答案 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日。