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

# 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 オブジェクトは、 たくさんの DateTimeImmutable や DateTime を生成するイテレータとして使えます。 パラメータ `start`, `interval`, `end`, および `recurrences` の数を指定できます。

返されるオブジェクトのクラスは、 `start` の祖先になるオブジェクトで、 DateTimeImmutable や DateTime に等しくなります。

### パラメータ

`start`

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

`interval`

  期間内での発生間隔。

`recurrences`

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

`end`

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

`isostr`

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

  PHP がサポートしていない、サブセットの機能の例を以下に示します:

  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/..."` を渡したり `end` に `null` を渡したりしても動作しません。

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open