Как перебирать месяцы в классе PHP DatePeriod?

#php #datetime

#php #datetime

Вопрос:

Мне нужно получить все числовые месяцы, охватываемые диапазоном дат. Итак, для диапазона 18 июля 2014 года — 4 сентября 2014 года дайте мне 7,8,9.

Это приближает меня:

 $start = new DateTime('2014-07-18');
$interval = new DateInterval('P1M');
$end = new DateTime('2014-09-04');
$period = new DatePeriod($start, $interval, $end);

foreach ($period as $dt) {
    echo $dt->format('n') . PHP_EOL;
}
  

Он возвращает 7 и 8, но не 9 для сентября, потому что это не полный интервал P1M. Я хотел бы получить 7,8,9 независимо от того, где в месяце выпадают начальные / конечные дни.

Я иду в правильном направлении?

Комментарии:

1. Вы могли бы заставить ваш день даты начала быть равным 1, а день даты окончания — 28 (так что он действителен для каждого месяца). Может быть, не очень чисто, но должно сработать.

Ответ №1:

Нашел ответ на этой странице: http://forums.phpfreaks.com/topic/275341-find-what-months-a-date-range-covers /

 $start = new DateTime('2014-07-18');
$end = new DateTime('2014-09-04');

$inc = DateInterval::createFromDateString('first day of next month');
$end->modify(' 1 day');

$p = new DatePeriod($start,$inc,$end);

foreach ($p as $d)
 echo $d->format('n') . PHP_EOL;
  

Выводит:

 7 8 9
  

Комментарии:

1. Спасибо за это. Есть небольшое расхождение, если конечная дата — последний день месяца (с 01 июля по 30 сентября получается 7,8,9,10), но я могу с этим смириться.

2. Странно, когда я использую ‘2014-07-18’ и ‘2014-09-30’, я все равно получаю ‘7 8 9’. Даже когда я использую ‘2014-07-18’ и ‘2014-08-31’, я получаю ‘7 8’.