2024 日本 PHP 研討會

DatePeriod::__construct

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DatePeriod::__construct建立新的 DatePeriod 物件

說明

public DatePeriod::__construct(
    DateTimeInterface $start,
    DateInterval $interval,
    int $recurrences,
    int $options = 0
)
public DatePeriod::__construct(
    DateTimeInterface $start,
    DateInterval $interval,
    DateTimeInterface $end,
    int $options = 0
)
警告
公開 DatePeriod::__construct(字串 $isostr, 整數 $options = 0)

此建構子變體已被棄用,請改用 DatePeriod::createFromISO8601String()

建立一個新的 DatePeriod 物件。

DatePeriod 物件可以用作迭代器,從 start 日期、intervalend 日期或 recurrences 次數生成多個 DateTimeImmutableDateTime 物件。

返回物件的類別等同於 start 物件的 DateTimeImmutableDateTime 祖先類別。

參數

start

期間的起始日期。預設包含在結果集中。

interval

期間內重複發生的間隔。

recurrences

重複發生的次數。返回結果的數量比此值多一個,因為起始日期預設包含在結果集中。必須大於 0

end

期間的結束日期。預設從結果集中排除。

isostr

» ISO 8601 重複間隔規範 的子集。

PHP 不支援的一些 ISO 8601 間隔規範功能的範例如下:

  1. 零次出現 (R0/)
  2. UTC (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 參數都將無法運作。

新增註釋

使用者貢獻的註釋

此頁面沒有使用者貢獻的註釋。
To Top