PHP DateInterval не возвращает последний день месяца

Я использую следующий код:

public static function getDays($day, $m, $y) { $days = new DatePeriod( new DateTime("first $day of $m $y"), DateInterval::createFromDateString('next ' . $day), new DateTime("last day of $m $y") ); foreach ($days as $day) { $dates[] = $day->format("Ymd"); } return $dates; } 

Это работает по большей части. Я даю ему диапазон, и он возвращает дату каждого дня, когда я буду внутри диапазона.

Применение:

 foreach(General::getDays('friday',$this->_uri[2],$this->_uri[3]) as $date) { var_dump($date); } 

В июле 2013 года это возвращает правильные 4 результата, все пятницы в июле 2013 года:

 string '2013-07-05' (length=10) string '2013-07-12' (length=10) string '2013-07-19' (length=10) string '2013-07-26' (length=10) 

Тем не менее, в течение месяца, когда последний день соответствует сегодняшнему значению, которое я получаю после (пятница, например, в мае 2013 года и в январе 2014 года), он пропускает последний день месяца из возвращаемых результатов.

Результаты мая 2013 года, конечно, отсутствуют 31-й, который находится в пятницу:

 string '2013-05-03' (length=10) string '2013-05-10' (length=10) string '2013-05-17' (length=10) string '2013-05-24' (length=10) 

У кого-нибудь есть ответ на это? Является ли это моим промахом DateInterval или подлинной ошибкой в ​​этом классе?

Проблема заключается в том, что сама дата даты / времени никогда не включается в период – то есть объект DatePeriod представляет дату / время в диапазоне [$startDate, $endDate) ¹.

Вы должны добавить одну секунду, по крайней мере, до конечной даты, чтобы всегда получать ожидаемые результаты. Но давайте не будем скупыми и добавим целую минуту:

 $days = new DatePeriod( new DateTime("first $day of $m $y"), DateInterval::createFromDateString('next ' . $day), new DateTime("last day of $m $y 00:01") ); 

¹, если вы не используете параметр DatePeriod::EXCLUDE_START_DATE , и в этом случае сама дата начала также исключается