Инициализирует новый экземпляр класса DatePeriod

# DatePeriod::__construct

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DatePeriod::__construct — Инициализирует новый экземпляр класса DatePeriod

### Описание

public function DatePeriod::__construct(
DateTimeInterface `$start`,
DateInterval `$interval`,
int `$recurrences`,
int `$options` = 0
)
public function DatePeriod::__construct(
DateTimeInterface `$start`,
DateInterval `$interval`,
DateTimeInterface `$end`,
int `$options` = 0
)
Внимание

Устаревший конструктор:

public function DatePeriod::__construct(string `$isostr`, int `$options` = 0)

Начиная с PHP 8.4.0 вариант конструктора устарел; периоды на основе интервалов повторения в формате стандарта ISO 8601 создают методом DatePeriod::createFromISO8601String().

Метод инициализирует новый объект DatePeriod.

Объект DatePeriod работает как итератор для генерации серии объектов DateTimeImmutable или DateTime на основе трёх параметров: начальной даты `start`, интервала `interval` и дополнительно конечной даты `end` или количества повторений `recurrences`.

Объект периода генерирует объекты, класс которых эквивалентен классу объекта в параметре `start`: DateTimeImmutable или DateTime.

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

`start`

  Начальная дата. По умолчанию включается в набор результатов.

`interval`

  Интервал.

`recurrences`

  Количество повторений: число больше `0`. Объект периода выдаст на одно повторение больше, поскольку начальная дата по умолчанию включается в набор результатов.

`end`

  Конечная дата. По умолчанию исключается из набора результатов.

`isostr`

  Строка с интервалом повторения, формат которого описывает спецификация стандарта » ISO 8601. PHP поддерживает только часть спецификаций.

  Пример отдельных спецификации интервалов по стандарту ISO 8601, которые PHP не поддерживает:

  1. нулевое количество повторений: `R0/`
  2. числовые обозначения смещения времени: `+02:00`; поддерживается только UTC-смещение `Z`
`options`

  Битовое поле для управления границами периода.

  `DatePeriod::EXCLUDE_START_DATE`: открывает границу слева и исключает начальную дату из набора повторений внутри периода.

  `DatePeriod::INCLUDE_END_DATE`: закрывает границу справа и включает конечную дату в набор повторений внутри периода.

### Ошибки

При передаче в параметр `isostr` интервала, формат которого не соответствует спецификациям стандарта ISO 8601, метод выбросит исключение DateMalformedPeriodStringException; до PHP 8.3 выбрасывалось исключение Exception.

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

Версия | Описание
--- | ---
8.4.0 | Сигнатура с параметром `isostr` устарела; период на основе интервалов повторения в формате стандарта ISO 8601 создают методом DatePeriod::createFromISO8601String().
8.3.0 | Вместо исключения Exception теперь выбрасывается исключение DateMalformedPeriodStringException.
8.2.0 | Добавили константу `DatePeriod::INCLUDE_END_DATE`.
7.2.19, 7.3.6, 7.4.0 | Параметр `recurrences` теперь принимает только значения больше `0`.

### Примеры

Пример #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";
    }

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

    Deprecated: Calling DatePeriod::__construct(string $isostr, int $options = 0) is deprecated, use DatePeriod::createFromISO8601String() instead in script on line 11
    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

Пример #3 Пример вывода через объект DatePeriod даты последнего четверга для каждого месяца года

    <?php

    $begin = new DateTime('2021-12-31');
    $end = new DateTime('2022-12-31 23:59:59');

    $interval = DateInterval::createFromDateString('last thursday of next month');
    $period = new DatePeriod($begin, $interval, $end, DatePeriod::EXCLUDE_START_DATE);

    foreach ($period as $dt) {
        echo $dt->format('l Y-m-d'), "\n";
    }

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

    Thursday 2022-01-27
    Thursday 2022-02-24
    Thursday 2022-03-31
    Thursday 2022-04-28
    Thursday 2022-05-26
    Thursday 2022-06-30
    Thursday 2022-07-28
    Thursday 2022-08-25
    Thursday 2022-09-29
    Thursday 2022-10-27
    Thursday 2022-11-24
    Thursday 2022-12-29

### Примечания

Неограниченное количество повторений не поддерживается, поэтому ни передача спецификатора `"R/..."` в параметр `isostr`, ни передача `null` в параметр `end` — не сработает. Подробнее о повторных интервалах времени рассказывает раздел 4.5 "Recurring time interval" стандарта ISO 8601.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open