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

mho*_*man 3 php

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

echo date("F Y", strtotime("-2 months"));
Run Code Online (Sandbox Code Playgroud)

这是在PHP 5.3.0上,如果它有所作为.

Ben*_*Lee 12

要获得您正在寻找的内容,您可以使用这个相当冗长的版本:

echo date("F Y", strtotime("first day of this month - 2 months"));
Run Code Online (Sandbox Code Playgroud)

您的原始版本的问题在此处详细描述:http://derickrethans.nl/obtaining-the-next-month-in-php.html.引用如下:

一遍又一遍的PHP用户抱怨下个月在PHP的日期字符串解析器中没有下个月,而是跳到下个月之后的那个; 如下例所示:

<?php
$d = new DateTime( '2010-01-31' );
$d->modify( 'next month' );
echo $d->format( 'F' ), "\n";
?>
Run Code Online (Sandbox Code Playgroud)

小脚本的输出将是March.3月显然不跟随1月,因为2月介于两者之间.但是,目前的行为是正确的.内部发生以下情况:

下个月将月份数(原来为1)增加一个.这使得日期为2010-02-31.第二个月(二月)在2010年只有28天,所以PHP自动更正了这一点,只是继续计算从2月1日起的天数.然后你在3月3日结束.格式化将逐年剥离,导致输出March.在使用完整日期格式回显日期时可以很容易地看到这一点,该格式将于2010年3月3日输出:

这是为了增加月份,但在减去月份时反向相同; 没有11月31日,所以strtotime方法"纠正"它到12月1日.

  • 感谢您提供该链接。我肯定会争辩说,这不是预期的行为,并且可能会在第 31 天的几个月内悄悄出现在某人身上。 (2认同)