(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 オブジェクトは、
たくさんの DateTimeImmutable
や DateTime を生成するイテレータとして使えます。
パラメータ start
,
interval
,
end
, および recurrences
の数を指定できます。
返されるオブジェクトのクラスは、
start
の祖先になるオブジェクトで、
DateTimeImmutable や
DateTime に等しくなります。
start
期間の開始日。デフォルトでは、 結果セットに含まれています。
interval
期間内での発生間隔。
recurrences
反復回数。
返される結果の数は、この値よりひとつ大きくなります。
なぜなら、デフォルトでは結果セットに開始日が含まれているからです。
0
より大きな値でなければいけません。
end
期間の終了日。 デフォルトでは、結果セットから除外されています。
isostr
» ISO 8601 repeating interval specification のサブセットを指定します。
PHP がサポートしていない、サブセットの機能の例を以下に示します:
R0/
)
Z
)。
たとえば +02:00
のようなものです。
options
開始日と終了日に関する振る舞いを制御するビットフィールド
DatePeriod::EXCLUDE_START_DATE
を指定すると、開始日を期間の結果セットから除外できます。
DatePeriod::INCLUDE_END_DATE
を指定すると、終了日を期間の結果セットに含めることができます。
isostr
が有効な ISO 8601 の期間としてパースできない場合、
DateMalformedPeriodStringException をスローします。
これより前のバージョンでは、Exception がスローされていました。
バージョン | 説明 |
---|---|
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";
}
?>
上の例の出力は以下となります。
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
ISO 8601 のセクション 4.5 "Recurring time interval" に記載されている無限回数の繰り返しには対応していません。
つまり、isostr
に
"R/..."
を渡したり end
に null
を渡したりしても動作しません。