(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
參數都將無法運作。