PHP strtotime () не возвращает правильный месяц

Поскольку текущий месяц / год – январь 2012 года, почему следующий код возвращается в декабре 2011 года, а не в ноябре 2011 года?

echo date("FY", strtotime("-2 months")); 

Это на PHP 5.3.0, если это имеет значение.

Чтобы получить то, что вы ищете, вы можете использовать эту довольно многословную версию:

 echo date("FY", strtotime("first day of this month - 2 months")); 

Проблема с вашей оригинальной версией подробно описана здесь: 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"; ?> 

Выход маленького скрипта будет в марте. Март явно не следует за январем, поскольку февраль находится между ними. Однако текущее поведение является правильным. Внутри происходит следующее:

в следующем месяце число месяца (первоначально 1) увеличивается на единицу. Это делает дату 2010-02-31. Второй месяц (февраль) имеет только 28 дней в 2010 году, поэтому PHP автоматически корректирует это, просто продолжая считать дни с 1 февраля. Затем вы закончите 3 марта. Формат форматирования отключается год и день, в результате чего появляется марка. Это легко увидеть при повторении даты с полным форматом даты, который выйдет 3 марта 2010 года:

Это для добавления месяцев, но то же самое применяется в обратном порядке при вычитании месяцев; 31 ноября не было, поэтому метод strtotime «исправляет» его до 1 декабря.