(PHP 5 >= 5.3.0, PHP 7, PHP 8)
DatePeriod::__construct — Инициализирует новый экземпляр класса DatePeriod
$start,$interval,$recurrences,$options = 0$start,$interval,$end,$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 не поддерживает:
R0/
+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.