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
)
警告
public DatePeriod::__construct(string $isostr
, int $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 がサポートしていない、サブセットの機能の例を以下に示します:
-
0回の繰り返し (
R0/
)
-
UTC 以外の時間のオフセット(
Z
)。
たとえば +02:00
のようなものです。
-
options
-
開始日と終了日に関する振る舞いを制御するビットフィールド
DatePeriod::EXCLUDE_START_DATE
を指定すると、開始日を期間の結果セットから除外できます。
DatePeriod::INCLUDE_END_DATE
を指定すると、終了日を期間の結果セットに含めることができます。
エラー / 例外
isostr
が有効な ISO 8601 の期間としてパースできない場合、
DateMalformedPeriodStringException をスローします。
これより前のバージョンでは、Exception がスローされていました。
例
例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
を渡したりしても動作しません。