php DatePeriod пропадают месяца

264
19 мая 2018, 01:30

Такой странный вопрос. Мне нужно получить все месяца (первый день месяца и последний день месяца) за 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" } 
}

Почему получается так, что после марта идёт май?

Answer 1

Используется некорректный интервал в 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

Answer 2

вариант без использования 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);
READ ALSO
Не работает Метод attach в laravel

Не работает Метод attach в laravel

Какой класс нужно подключить, что бы нашёлся метод attach?

271
Поиск по БД MySQL

Поиск по БД MySQL

Всем приветСтоит задача разработать интернет магазин по продаже pdf файлов

252
отправка ssl Сертификата для telegram на php

отправка ssl Сертификата для telegram на php

Есть бот, работал пол года, ранее с сертификатом тоже мучался, на проблема решилась

294
lower() меняет кодировку текста

lower() меняет кодировку текста

пытаюсь связать python с php, а именно - внедрить нейронные сети в сайтвызываю из php скрипт таким образом:

248