從Derick Rethans:
一遍又一遍PHP用戶抱怨說,下個月在PHP的日期字符串解析器不會進入下個月,而是跳到下個月後的那個;如下例所示:
<?php
$d = new DateTime('2010-01-31');
$d->modify('next month');
echo $d->format('F'), "\n";
?>
小腳本的輸出將爲3月。 3月顯然不會在1月份之後,因爲2月份之間。但是,目前的行爲是正確的。以下情況發生在內部:
下個月將月份數字(原爲1)加1。這 使日期2010-02-31。
第二個月(二月)在2010年只有28天,所以PHP通過繼續計算從2月1日起的天數來自動修正此問題。然後你在3月3日結束。
格式化日期和年份,導致輸出3月。呼應採用了全日期格式,將輸出2010年3月3日的日期
這可以很容易地看到:
<?php
echo $d->format('F jS, Y'), "\n";
?>
要獲得正確的行爲,你可以使用一些PHP 5.3的介紹相對時間節的新功能。本節可與下個月,第五個月或+8個月結合使用,以轉到指定月份的第一天。而不是從前面的例子中的下個月,我們在下個月的第一天在這裏:
<?php
$d = new DateTime('2010-01-08');
$d->modify('first day of next month');
echo $d->format('F'), "\n";
?>
此腳本將正確輸出2月。當PHP處理下個月的第一天時,下面的事情發生:
除了第一天,還有一個等同的最後一天去一個月的最後一天。下面的例子說明了這一點:
<?php
$d = new DateTime('2010-01-08');
$d->modify('last day of next month');
echo $d->format('F jS, Y'), "\n";
?>
此輸出2月28日,2010年國內將出現以下情況:
下個月增加1個月數量(最初爲1)。這使得日期2010-02-08。
最後一天將月份數字加1,並將天數設置爲0,導致日期2010-03-00。
然後,PHP會自動更正無效日期編號0,從月份中刪除一個並跳到該月份的最後一天,從而導致2010-02-28。
我希望這清除了PHP的日期/時間處理的一些行爲。
復活從[這裏](http://stackoverflow.com/questions/28218413/strtotime-result-makes-no-sense-php-bug#comment44816201_28218533)評論, _這就是爲什麼php的strtotime既驚人又可怕的同時 - yuvi_ – Chay22