Подтвердить что ты не робот

PHP date() и strtotime() возвращают неправильные месяцы 31-го

Я использую функции date() и strtotime() для отображения следующих 3 месяцев в раскрывающемся списке.

Код PHP:

   echo date("m/Y",strtotime("+0 months")); 
   echo date("m/Y",strtotime("+1 months"));
   echo date("m/Y",strtotime("+2 months")); 

Однако, если script выполняется, когда дата сервера находится на 30-м или 31-м, следующий месяц, который является Feburary, будет отображаться в марте вместо этого. то есть предполагается, что script возвращает

01/2012
02/2012
03/2012

Но вместо этого на самом деле отображается

01/2012
03/2012
03/2012

потому что Feburary не имеет 30-го или 31-го, поэтому script переводит "31/02" в "01/03".

Я прочитал страницу strtotime() на php.net, эта проблема была поднята, но полезных решений не было. Так может ли кто-нибудь помочь мне найти простой способ решить эту проблему? Спасибо заранее!

4b9b3361

Ответ 1

Как указано в документации, вы должны передать дату первого дня текущего месяца в качестве второго параметра функции strtotime():

$base = strtotime(date('Y-m',time()) . '-01 00:00:01');
echo date('m/Y',strtotime('+0 month', $base));
echo date('m/Y',strtotime('+1 month', $base));
echo date('m/Y',strtotime('+2 month', $base));

Смотрите, что он работает: http://ideone.com/eXis9

01/2012

02/2012

03/2012

Ответ 2

Попробуйте использовать "первый день" в своем strtotime, например:

strtotime("first day of +1 month");

Это будет фиксировать даты (в том случае, если сегодня было 30 января), например, 02-30 (Yields march 2nd), путем преобразования его в 02-01 (1 февраля), который затем дает правильный месяц. Это немного чище, чем другие методы, и легче запомнить.

Ответ 3

echo date('m/Y', strtotime(date('Y-m') . '-01 +2 months'));

Просто скопируйте его первым месяцем.

Ответ 4

Не используйте strtotime() для получения даты смещения по месяцам. Он работает правильно только в PHP 5.3+. Лучший способ решить эту проблему - mktime(). Ниже приведен пример кода:

function getOffsetByMonths($nMonths, $nNow = 0) {
    if ($nNow)
        return mktime(0, 0, 0, date('n', $nNow)+ $nMonths, 1, date('Y', $nNow));
    else
        return mktime(0, 0, 0, date('n')+ $nMonths);
}
$nNow = mktime(0, 0, 0, 1, 31, 2013);
echo "Now: ". date("Y-m-d", $nNow).
"<br>(Now - 1 month): ". date("Y-m", getOffsetByMonths(-1, $nNow)). "-xx".
"<br>(Now - 2 month): ". date("Y-m", getOffsetByMonths(-2, $nNow)). "-xx".
"<br>(Now - 3 month): ". date("Y-m", getOffsetByMonths(-3, $nNow)). "-xx";