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, эта проблема была поднята, но полезных решений не было. Так может ли кто-нибудь помочь мне найти простой способ решить эту проблему? Спасибо заранее!
Ответы
Ответ 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";