Intereting Posts
Parsing stdClass Данные объекта в php Замените некоторые строки в PHP регулярным выражением? Laravel 5.1: вызов функции из строки Подтвердите введенный пользователем код PHP, прежде чем передавать его в eval () PHP: Возможно автоматическое получение всех данных POSTed? Посещает счетчик без базы данных с PHP Как подключить несколько баз данных в инфраструктуре phalcon в то же время использовать как в классе модели не только один Поиск учебника для начинающих Kohana для PHP Символ сеанса – как он работает? Поиск строки или части строки в PHP Amazon MWS PHP Отметьте заказ как отправленный – Подтвердите заказ Выполнение с доставкой с XML в переменной Какова рекомендуемая практика для API-интерфейса PayPal NVP с остановкой и возвратом подписки? Создайте таблицу с пробелом в имени в mySQL PHP извлекает и сохраняет удаленное изображение Ошибка Mysqli: количество столбцов не соответствует количеству значений в строке 1

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

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