PHP 8.4.24 Released!

DatePeriod::__construct

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

DatePeriod::__construct新しい DatePeriod オブジェクトを作成する

説明

public function DatePeriod::__construct(
    DateTimeInterface $start,
    DateInterval $interval,
    int $recurrences,
    int $options = 0
)
public function DatePeriod::__construct(
    DateTimeInterface $start,
    DateInterval $interval,
    DateTimeInterface $end,
    int $options = 0
)
警告

以下のコンストラクタのバリエーションは、推奨されなくなりました。

public function DatePeriod::__construct(string $isostr, int $options = 0)

このコンストラクタのバリエーションは、PHP 8.4.0 以降は非推奨です。 代わりに DatePeriod::createFromISO8601String() を使ってください。

新しい DatePeriod オブジェクトを作成します。

DatePeriod オブジェクトは、 たくさんの DateTimeImmutableDateTime を生成するイテレータとして使えます。 パラメータ startinterval に加えて、 end または recurrences (繰り返し回数) のいずれかを指定します。

返されるオブジェクトのクラスは、start オブジェクトの祖先クラスである DateTimeImmutable または DateTime と同じになります。

パラメータ

start

期間の開始日。デフォルトでは、 結果セットに含まれています。

interval

期間内での発生間隔。

recurrences

反復回数。 返される結果の数は、この値よりひとつ大きくなります。 なぜなら、デフォルトでは結果セットに開始日が含まれているからです。 0 より大きな値でなければいけません。

end

期間の終了日。 デフォルトでは、結果セットから除外されています。

isostr

» ISO 8601 repeating interval specification のサブセットを指定します。

PHP がサポートしていない ISO 8601 期間指定の機能の例を以下に示します:

  1. 0回の繰り返し (R0/)
  2. UTC (Z) 以外のタイムオフセット。 たとえば +02:00 のようなものです。
options

開始日と終了日に関する振る舞いを制御するビットフィールド。

DatePeriod::EXCLUDE_START_DATE を指定すると、開始日を期間の結果セットから除外できます。

DatePeriod::INCLUDE_END_DATE を指定すると、終了日を期間の結果セットに含めることができます。

エラー / 例外

isostr が有効な ISO 8601 の期間としてパースできない場合、 DateMalformedPeriodStringException をスローします。 PHP 8.3 より前のバージョンでは、Exception がスローされていました。

変更履歴

バージョン 説明
8.4.0 isostr を使うシグネチャは非推奨となりました。 代わりに DatePeriod::createFromISO8601String() を使ってください。
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";
}

上の例の出力は以下となります。

Deprecated: Calling DatePeriod::__construct(string $isostr, int $options = 0) is deprecated, use DatePeriod::createFromISO8601String() instead in script on line 11
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/..." を渡したり endnull を渡したりしても動作しません。

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top