(PHP 5 >= 5.3.0, PHP 7, PHP 8)
DatePeriod::__construct — 创建一个新的 DatePeriod 对象
$start
,$interval
,$recurrences
,$options
= 0$start
,$interval
,$end
,$options
= 0此构造函数变体已弃用,请改用 DatePeriod::createFromISO8601String()。
创建一个新的 DatePeriod 对象。
DatePeriod 对象可以用作迭代器,从 start
日期、interval
和 end
日期或 recurrences
的数量生成多个 DateTimeImmutable 或 DateTime 对象。
返回对象的类等效于 start
对象的 DateTimeImmutable 或 DateTime 祖先类。
start
周期的起始日期。默认情况下包含在结果集中。
interval
周期内递归之间的间隔。
recurrences
递归次数。返回结果的数量比这多一个,因为起始日期默认包含在结果集中。必须大于 0
。
end
周期的结束日期。默认情况下不包含在结果集中。
isostr
一个 » ISO 8601 重复间隔规范 的子集。
PHP 不支持的一些 ISO 8601 间隔规范功能示例是
R0/
)
Z
) 之外的时区偏移量,例如 +02:00
。
options
一个位字段,可用于控制起始日期和结束日期的某些行为。
使用 DatePeriod::EXCLUDE_START_DATE
,您可以从周期内递归日期集中排除起始日期。
使用 DatePeriod::INCLUDE_END_DATE
,您可以将结束日期包含在周期内递归日期集中。
当 isostr
不能解析为有效的 ISO 8601 周期时,会抛出 DateMalformedPeriodStringException。在 PHP 8.3 之前,这是 Exception。
版本 | 说明 |
---|---|
8.3.0 | 现在抛出 DateMalformedPeriodStringException 而不是 Exception。 |
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";
}
?>
上面的示例将输出
2012-07-01 2012-07-08 2012-07-15 2012-07-22 2012-07-29
示例 #2 带有 DatePeriod::EXCLUDE_START_DATE
的 DatePeriod 示例
<?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
ISO 8601 第 4.5 节“重复时间间隔”中指定的无限次重复不受支持,即,既不能传递 "R/..."
作为 isostr
,也不能传递 null
作为 end
。