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

Я использую функции 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")); 

Однако, если скрипт работает, когда дата сервера 30 или 31, следующий месяц, то есть февраль, будет отображаться как март. то есть приведенный выше скрипт должен возвращать

01/2012
02/2012
03/2012

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

01/2012
03/2012
03/2012

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

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

Ответы [ 4 ]

28 голосов
/ 30 января 2012

Как указано в документации, вы должны передать дату первого дня текущего месяца в качестве второго параметра функции 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

11 голосов
/ 31 мая 2012

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

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

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

4 голосов
/ 30 января 2012
echo date('m/Y', strtotime(date('Y-m') . '-01 +2 months'));

Просто жестко запишите его, чтобы быть первым в месяце.

0 голосов
/ 28 февраля 2013

Не используйте 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";
...