Вчера это работало нормально, без изменений.
echo date("M", strtotime("-3 month", time()) ); echo date("M", strtotime("-2 month", time()) ); echo date("M", strtotime("-1 month", time()) ); echo date("M", time()); Вывод, который он производил вчера, был таким, каким вы ожидали, например, Apr, May, Jun, Jul
Сегодня это повторяет май май июль июль
Есть идеи?
Заранее спасибо.
Это может быть связано с ошибкой # 44073
Вы можете попробовать что-то вроде этого:
 echo date("M", strtotime("-3 month", strtotime(date("F") . "1")) ) . "\n"; echo date("M", strtotime("-2 month", strtotime(date("F") . "1")) ) . "\n"; echo date("M", strtotime("-1 month", strtotime(date("F") . "1")) ) . "\n"; echo date("M", time()) . "\n"; 
  (Решение найдено в разделе комментариев strtotime , прямая ссылка ) 
И выход:
 Apr May Jun Jul 
Вид «обмана» с форматом даты и именем месяца и всем этим …
Горден правильно определил проблему, но я хотел дать другое решение, которое было бы полезным, а не техническим. Просто используйте «первый день» или «последний день» в своем strtotime. Например, следующие примеры преодолевают проблему 31-го месяца:
 // Today is May 31st //All the following return 2012-04-30 echo date('Ym-d', strtotime("last day of -1 month")); echo date('Ym-d', strtotime("last day of last month")); echo date_create("last day of -1 month")->format('Ym-d'); // All the following return 2012-04-01 echo date('Ym-d', strtotime("first day of -1 month")); echo date('Ym-d', strtotime("first day of last month")); echo date_create("first day of -1 month")->format('Ym-d'); 
  Попробуйте это вместо strtotime : 
 mktime(0, (date("n") - 3 + 12) % 12, 1) 
  Идея состоит в том, чтобы взять текущий номер месяца ( date("n") ), вычесть количество месяцев от него, которое вы хотите (здесь -3 ), добавить 12 к нему, а затем получить по модулю 12. 
Это известное и ожидаемое поведение. Причина этого в том, что месяц является относительной датой без фиксированной длины. С http://www.gnu.org/software/tar/manual/html_node/Relative-items-in-date-strings.html#SEC120
Единицу смещения времени можно выбрать по строке «год» или «месяц» для перемещения целыми годами или месяцами. Это нечеткие единицы, поскольку годы и месяцы не одинаковы. Более точные единицы – «две недели», стоимость которых составляет 14 дней, «неделя» – 7 дней, «день» – 24 часа, «час» – 60 минут, минута или минута 60 секунд, вторая – 'sec' стоит одна секунда. Суффикс 's' на этих устройствах принимается и игнорируется.
Следовательно (акцент мой)
Fuzz в единицах может вызвать проблемы с относительными элементами. Например, «2003-07-31 -1 месяц» может оцениваться до 2003-07-01, поскольку 2003-06-31 является недопустимой датой. Чтобы более надежно определить предыдущий месяц, вы можете запросить месяц до 15 числа текущего месяца . Например:
$ date -R Thu, 31 Jul 2003 13:02:39 -0700 $ date --date='-1 month' +'Last month was %B?' Last month was July? $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!' Last month was June!
Вышеприведенное может быть выражено в PHP как
 echo date('M', strtotime(date('Ym-') . '15 -1 month')); 
Также см. Сообщения ниже http://bugs.php.net/bug.php?id=22486
Из PHP 5.3 (ссылка: https://bugs.php.net/bug.php?id=44073 ) и выше вы можете сделать:
  « first day of +1 month » или « first day of next month » или даже « last day of next month », 
Пример:
 $date = '2015-12-31'; echo date("Ymd", strtotime($date ."first day of previous month")); 
  Будет производить: 2015-11-01 Это не рассчитывает дни на +30 дней. 
простой способ мог бы написать его вот так:
echo date («M», strtotime («в этом году +3 месяца»));
или
echo date («M», strtotime («в этом месяце -3 месяца»));
зависит от того, что вы используете для ..