PHP 8.6.0 Beta 1 is available for testing

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.

Нашли ошибку?

ИнструкцияИсправлениеСообщение об ошибке
+Добавить

Примечания пользователей

Пользователи ещё не добавляли примечания для страницы

AltStyle によって変換されたページ (->オリジナル) /