(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
传递。