Показать список последних 11 месяцев с текущей даты

Я рисую гистограмму, а значения по оси x — это месяцы за последний год. Например, это март 2014 года; таким образом, значения на оси X находятся в диапазоне от апреля 2013 г. до марта 2014 г., который является текущим месяцем.

Я использую echo date('M'); для печати текущего месяца и echo date('M', strtotime(' -1 month')); и echo date('M', strtotime(' -2 month')); и так далее, чтобы получить все предыдущие месяцы.

Они работали нормально до сегодняшнего дня, 29 марта.

Там, где должно быть «Фев», также печатается «Мар». Я полагаю, это потому, что в феврале 28 дней.

Есть ли простое решение этой проблемы без использования операторов if... else или сокращенных операторов if... else во всех операторах echo, сообщающих об этом echo date('M', strtotime('-n month 2 days')); ?


person angus    schedule 29.03.2014    source источник
comment
Вы можете начать с получения метки времени для первого дня текущего месяца, а затем вычесть из нее месяцы, чтобы избежать проблемы с месяцами, имеющими разное количество дней.   -  person CBroe    schedule 29.03.2014


Ответы (1)


Это связано с тем, как PHP обрабатывает математику даты. Вы должны убедиться, что вы всегда работаете с первым числом месяца, чтобы гарантировать, что февраль не будет пропущен.

DateTime(), DateInterval() и DatePeriod() сделать это очень просто:

$start    = new DateTime('11 months ago');
// So you don't skip February if today is day the 29th, 30th, or 31st
$start->modify('first day of this month'); 
$end      = new DateTime();
$interval = new DateInterval('P1M');
$period   = new DatePeriod($start, $interval, $end);
foreach ($period as $dt) {
    echo $dt->format('F Y') . "<br>";
}

Посмотрите в действии

Очевидно, вы можете изменить $dt->format('F Y') на $dt->format('M') в соответствии с вашими конкретными целями. Я отобразил месяц и год, чтобы продемонстрировать, как это работает.

person John Conde    schedule 29.03.2014