2012-01-30 3 views
12

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

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 не тридцатого или тридцать первого, так что скрипт переводит «31/02 "в" 01/03 ".

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

+1

возможно дубликат [StrToTime возвращает неправильный штамп времени для '-1 месяц'] (http://stackoverflow.com/questions/5481949/strtotime-returns-incorrect-timestamp-for -1-month) и [PHP Strtotime -1month -2month] (http://stackoverflow.com/questions/1211824/php-strtotime-1month-2month) и [Сколько дней составляет 1 месяц в PHP?] (Http : //stackoverflow.com/questions/5464221/how-many-days-does-1-month-represent-in-php) и [strtotime "в следующем месяце" не действует, как ожидалось (сегодня это)] (http://stackoverflow.com/questions/6182925/strtotime-next-month-not-acting-as-expected-today-that-is) – animuson

ответ

25

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

+1

Учитывая '$ base = strtotime ('2016-12-31'.'-01 00:00:01'); 'порог решения печатает 2 февраля для' +2 месяца' и '+3 месяца' –

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

Просто введите код, который будет первым.

9

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

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

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

+0

Очень элегантное решение. –

+0

Это должен быть принятый ответ! –

0

Не используйте 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"; 
Смежные вопросы