Такой странный вопрос. Мне нужно получить все месяца (первый день месяца и последний день месяца) за 11 месяцев (для создания графиков). Но периодически "пропадают" месяца. В данный момент пропал апрель. Пример кода
$date = new DateTime('-11 month');
$lastYearDate = $date->format('Y-m-d ');
$from = new DateTime($lastYearDate);
$to = new DateTime(date("Y-m-d 00:01"));
$period = new DatePeriod($from, new DateInterval('P1D'), $to);
$lastYearMonth = $date->format('Y-m-d');
$from = new DateTime($lastYearMonth);
$to = new DateTime(date('Y-m-d'));
$period = new DatePeriod($from, new DateInterval('P32D'), $to);
$arrayOfMonth = array_map(
function ($item) {
$dateOfMonth = array();
$dateOfMonth['year'] = $item->format('Y');
$dateOfMonth['month'] = $item->format('m');
$dateOfMonth['first_days'] = $item->format('Y-m-01');
$dateOfMonth['last_days'] = $item->format('Y-m-t');
return $dateOfMonth;
},
iterator_to_array($period)
);
Вот вывод массива arrayOfMonth:
array(11) {
[0]=> array(4) { ["year"]=> string(4) "2017" ["month"]=> string(2) "06" ["first_days"]=> string(10) "2017-06-01" ["last_days"]=> string(10) "2017-06-30" }
[1]=> array(4) { ["year"]=> string(4) "2017" ["month"]=> string(2) "07" ["first_days"]=> string(10) "2017-07-01" ["last_days"]=> string(10) "2017-07-31" }
[2]=> array(4) { ["year"]=> string(4) "2017" ["month"]=> string(2) "08" ["first_days"]=> string(10) "2017-08-01" ["last_days"]=> string(10) "2017-08-31" }
[3]=> array(4) { ["year"]=> string(4) "2017" ["month"]=> string(2) "09" ["first_days"]=> string(10) "2017-09-01" ["last_days"]=> string(10) "2017-09-30" }
[4]=> array(4) { ["year"]=> string(4) "2017" ["month"]=> string(2) "10" ["first_days"]=> string(10) "2017-10-01" ["last_days"]=> string(10) "2017-10-31" }
[5]=> array(4) { ["year"]=> string(4) "2017" ["month"]=> string(2) "11" ["first_days"]=> string(10) "2017-11-01" ["last_days"]=> string(10) "2017-11-30" }
[6]=> array(4) { ["year"]=> string(4) "2017" ["month"]=> string(2) "12" ["first_days"]=> string(10) "2017-12-01" ["last_days"]=> string(10) "2017-12-31" }
[7]=> array(4) { ["year"]=> string(4) "2018" ["month"]=> string(2) "01" ["first_days"]=> string(10) "2018-01-01" ["last_days"]=> string(10) "2018-01-31" }
[8]=> array(4) { ["year"]=> string(4) "2018" ["month"]=> string(2) "02" ["first_days"]=> string(10) "2018-02-01" ["last_days"]=> string(10) "2018-02-28" }
[9]=> array(4) { ["year"]=> string(4) "2018" ["month"]=> string(2) "03" ["first_days"]=> string(10) "2018-03-01" ["last_days"]=> string(10) "2018-03-31" }
[10]=> array(4) { ["year"]=> string(4) "2018" ["month"]=> string(2) "05" ["first_days"]=> string(10) "2018-05-01" ["last_days"]=> string(10) "2018-05-31" }
}
Почему получается так, что после марта идёт май?
Используется некорректный интервал в 32 дня.
<?php
$dt = new \DateTime();
$month = new \DateInterval('P1M');
for ($i = 0; $i < 12; ++$i) {
echo $dt->format('Y-m-01 - Y-m-t')."\n";
$dt->add($month);
}
2018-05-01 - 2018-05-31
2018-06-01 - 2018-06-30
2018-07-01 - 2018-07-31
2018-08-01 - 2018-08-31
2018-09-01 - 2018-09-30
2018-10-01 - 2018-10-31
2018-11-01 - 2018-11-30
2018-12-01 - 2018-12-31
2019-01-01 - 2019-01-31
2019-02-01 - 2019-02-28
2019-03-01 - 2019-03-31
2019-04-01 - 2019-04-30
вариант без использования DateInterval, для коллекции.
$mcount = 11;
$result = array_map(function($m){
return (new DateTime("-$m month"))->format("Y-m-01 - Y-m-t\n");
}, range($mcount , 0));
print_r($result);
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости