DatePeriod::__construct

(PHP 5 >= 5.3.0, PHP 7)

DatePeriod::__constructСоздает новый объект DatePeriod

Описание

public DatePeriod::__construct ( DateTimeInterface $start , DateInterval $interval , int $recurrences [, int $options ] )
public DatePeriod::__construct ( DateTimeInterface $start , DateInterval $interval , DateTimeInterface $end [, int $options ] )
public DatePeriod::__construct ( string $isostr [, int $options ] )

Создает новый объект DatePeriod.

Список параметров

start

Начальная дата.

interval

Интервал.

recurrences

Количество повторений.

end

Конечная дата.

isostr

Строка, содержащая интервал согласно спецификации ISO 8601.

options

Может быть установлено значение DatePeriod::EXCLUDE_START_DATE, для исключения начальной даты из периода.

Список изменений

Версия Описание
5.5.8 Тип параметра end изменен на DateTimeImmutable. Ранее использовался DateTime.
5.5.0 Тип параметра start изменен на DateTimeImmutable. Ранее использовался DateTime.

Примеры

Пример #1 Пример использования DatePeriod

<?php
$start 
= new DateTime('2012-07-01');
$interval = new DateInterval('P7D');
$end = new DateTime('2012-07-31');
$recurrences 4;
$iso 'R4/2012-07-01T00:00:00Z/P7D';

// Эти периоды эквивалентны.
$period = new DatePeriod($start$interval$recurrences);
$period = new DatePeriod($start$interval$end);
$period = new DatePeriod($iso);

// При переборе экземпляра DatePeriod в цикле будут отображены все отобранные даты
// периода.
foreach ($period as $date) {
    echo 
$date->format('Y-m-d')."\n";
}
?>

Результат выполнения данного примера:

2012-07-01
2012-07-08
2012-07-15
2012-07-22
2012-07-29

Пример #2 Пример использования DatePeriod с DatePeriod::EXCLUDE_START_DATE

<?php
$start 
= new DateTime('2012-07-01');
$interval = new DateInterval('P7D');
$end = new DateTime('2012-07-31');

$period = new DatePeriod($start$interval$end,
                         
DatePeriod::EXCLUDE_START_DATE);

// При переборе экземпляра DatePeriod в цикле будут отображены все отобранные даты
// периода.
// Однако в этом случае 2012-07-01 не будет отображена.
foreach ($period as $date) {
    echo 
$date->format('Y-m-d')."\n";
}
?>

Результат выполнения данного примера:

2012-07-08
2012-07-15
2012-07-22
2012-07-29

Коментарии

I found two things useful to know that aren't covered here.

1. endDate is excluded:

<?php
$i 
= new DateInterval('P1D');
$d1 = new Datetime();
$d2 = clone $d1$d2->add($i);
foreach(new 
DatePeriod($d1$i$d2) as $d) {
    echo 
$d->format('Y-m-d H:i:s') . "\n";
}
?>

Will output:
2010-11-03 12:39:53

(Another one because I got it wrong at first)
2. For the first form, recurrences really means REcurrences, not occurences.

<?php
$i 
= new DateInterval('P1D');
$d = new Datetime();
foreach(new 
DatePeriod($d$i1) as $d) {
    echo 
$d->format('Y-m-d H:i:s') . "\n";
}
?>

Will output:
2010-11-03 12:41:05
2010-11-04 12:41:05
2010-11-03 05:50:57
http://php5.kiev.ua/manual/ru/dateperiod.construct.html
When you add the time 23:59:59 to the end DateTime object something like the following then the end date will be included in the period:

<?php
$date_start 
= new DateTime('2012-03-12');
$date_end = new DateTime('2012-03-22 23:59:59');

$interval '+2 days';
$date_interval DateInterval::createFromDateString($interval);

$period = new DatePeriod($date_start$date_interval$date_endDatePeriod::EXCLUDE_START_DATE);

foreach(
$period as $dt) {
 echo 
$dt->format('d/m');
}
?>

OUTPUT:
14/03
16/03
18/03
20/03
22/03
2012-08-07 08:02:13
http://php5.kiev.ua/manual/ru/dateperiod.construct.html
The parameter isostr should accept an ISO 8601 format, but doing this is not work :
<?php
      $dateStart 
date_create('first day of next month this year');

     
$isoStr $dateStart ->format(DateTimeInterface::ISO8601);
     
$datePeriod = new DatePeriod("R10/{$isoStr}/P1M");
     
// Throw Exception : DatePeriod::__construct(): Unknown or bad format (R10/2020-02-01T22:52:26+0000Z/P1M)
     
     // While doing it by this way works
   
$datePeriod = new DatePeriod($dateStart DateInterval::createFromDateString("+1 month"), 10);
?>
2020-01-08 00:23:31
http://php5.kiev.ua/manual/ru/dateperiod.construct.html
With reference to the Changelog above, 'recurrences' must be greater than 0 now.

This was not the case in PHP5 ( >= 5.3.0). A foreach loop over a DatePeriod with recurrences == 0 would
execute one time. A function could accept a $count parameter which represented the number of times to execute
the code in a foreach loop, and then initialize a DatePeriod with 'recurrences' == ($count-1) to get the desired
number of iterations.

The following example adds a special case for PHP7 and above to handle the situation where a single
iteration is desired.

Note that an alternative solution to subracting 1 from the desired count is to subtract one month from the desired starting month,       
and then intialize the DatePeriod with the option DatePeriod::EXCLUDE_START_DATE.

<?php
       
// displayCalender() is a stub.
        // In a real application, this would generate a displayable calendar for the specified month.
        // 
        // $tp is a DateTime object used to specify the month for which a calendar will be displayed
       
function displayCalendar($tp)
        {
               
$format "F, Y";
                echo 
"Display Calendar for " $tp->format($format) . "\n";
        }

       
// $date is the first month to show
        // $count is the number of months to show
        // NOTE: the number of "recurrences" is one less than the number of months to display
       
function showMonths($date false$count 1)
        {
               
$format "Y-m-d 00:00:00";
               
$init = ($date $date date($format));
               
$one_month = new DateInterval("P1M");

               
// get the starting month and day
               
$start = new DateTime($init);

                echo 
"Show $count month" . ($count "s" "") . "\n";
               
//check for PHP7 or greater
               
if ($count == && (substr(phpversion(), 01) >= 7) )
                {
                       
// Special case for PHP7 when $count == 1
                       
displayCalendar($start);
                }   
                else
                {
                       
// PHP5 does not need special case, because 0 is accepted value
                        //      for number of recurrences
                       
$time_period = new DatePeriod($start$one_month, ($count-1));
                        foreach (
$time_period as $tp)
                        {
                               
displayCalendar($tp);
                        }
                }
                echo 
"\n";
        }
       
       
// Show calendar for specific month
       
$first_month "2021-11";
       
showMonths($first_month);
       
       
// Show calendars for a full year
       
$first_month "2021-01";
       
showMonths($first_month12);
?>

The above example will output:

Show 1 month
Display Calendar for November, 2021

Show 12 months
Display Calendar for January, 2021
Display Calendar for February, 2021
Display Calendar for March, 2021
Display Calendar for April, 2021
Display Calendar for May, 2021
Display Calendar for June, 2021
Display Calendar for July, 2021
Display Calendar for August, 2021
Display Calendar for September, 2021
Display Calendar for October, 2021
Display Calendar for November, 2021
Display Calendar for December, 2021
2021-11-01 08:58:45
http://php5.kiev.ua/manual/ru/dateperiod.construct.html

    Поддержать сайт на родительском проекте КГБ