Я использую функции date()
и strtotime()
для отображения следующих трех месяцев в выпадающем списке.
Код PHP:
echo date("m/Y",strtotime("+0 months")); echo date("m/Y",strtotime("+1 months")); echo date("m/Y",strtotime("+2 months"));
Однако, если сценарий запущен, когда дата сервера 30 или 31, следующий месяц, который является Feburary, будет отображаться как март вместо этого. т. е. предполагается, что сценарий выше
01/2012 02/2012 03/2012
Но вместо этого он фактически отображает
01/2012 03/2012 03/2012
это потому, что Feburary не имеет 30-го или 31-го, поэтому сценарий переводит «31/02» в «01/03».
Я прочитал strtotime()
на php.net, эта проблема была поднята, но полезных решений не было. Так может ли кто-нибудь помочь мне найти простой способ решить эту проблему? Заранее спасибо!
Как указано в документации, вы должны передать дату первого дня текущего месяца в качестве второго параметра функции 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
Попробуйте использовать «первый день» в своем strtotime, например:
strtotime("first day of +1 month");
Это будет фиксировать даты (в том случае, если сегодня было 30 января), например 02-30 (Yields march 2nd), путем преобразования его в 02-01 (1 февраля), который затем дает правильный месяц. Это немного чище, чем другие методы, и легче запомнить.
echo date('m/Y', strtotime(date('Y-m') . '-01 +2 months'));
Просто введите код, чтобы он был первым в этом месяце.
Не используйте 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("Ymd", $nNow). "<br>(Now - 1 month): ". date("Ym", getOffsetByMonths(-1, $nNow)). "-xx". "<br>(Now - 2 month): ". date("Ym", getOffsetByMonths(-2, $nNow)). "-xx". "<br>(Now - 3 month): ". date("Ym", getOffsetByMonths(-3, $nNow)). "-xx";