PHPのDatePeriodでエラーが発生しない記述方法まとめ

カレンダーを作成する際に使用した DatePeriod についてまとめました。

DatePeriod の中で、特に end と DateInterval の設定でつまづく人が多いので、DatePeriod でつまづいている人は参考にしてみてください。

DatePeriodは日付の期間を表すクラス

DatePeriodは日付や時間をループ処理する際に使用されるクラスで、カレンダーを作成する場合は便利です。

基本的には、$start(始まり)、$end(終わり)、$interval(間隔)の3つを指定して表示します。


PHP

<?php $begin = new DateTime( '2019-07-01' ); $end = new DateTime( '2019-07-05' ); $interval = new DateInterval('P1D'); // 1日間間隔 $daterange = new DatePeriod($begin, $interval ,$end); foreach($daterange as $date){ echo $date->format("Ymd"); echo "\n"; # $end の "2019-07-05" は出力されない } ?> # 出力結果 20190701 20190702 20190703 20190704

endで指定した日を含む範囲を指定した場合

DatePeriodの期間の終了日を指定するプロパティ「end」がありますが、endは最終日を含みません。

例えば、下記のようなコードの場合、最終日は2019/7/04となります。


PHP

<?php $begin = new DateTime( '2019-07-01' ); $end = new DateTime( '2019-07-05' ); $interval = new DateInterval('P1D'); // 1日間間隔 $daterange = new DatePeriod($begin, $interval ,$end); foreach($daterange as $date){ echo $date->format("Ymd"); echo "\n"; # $end の "2019-07-05" は出力されない } ?> # 出力結果 20190701 20190702 20190703 20190704

endは指定した日付は含まないため、2019/7/5は含まれません。

そこで、下記の $end = $end->modify( ‘+1 day’ ); というコードを付け加えると、endの日付も含まれた期間に設定できます。


PHP

<?php $begin = new DateTime( '2019-07-01' ); $end = new DateTime( '2019-07-05' ); $end = $end->modify( '+1 day' ); $interval = new DateInterval('P1D'); $daterange = new DatePeriod($begin, $interval ,$end); foreach($daterange as $date){ echo $date->format("Ymd"); echo "\n"; } ?> # 出力結果 20190701 20190702 20190703 20190704 20190705

DateIntervalで指定できる間隔

DateInterval には、日以外にも年、月、時、分、秒の指定ができます。

コードを書く際は、表の上から順に書かないとエラーになります。

記号 単位
Y
M
D
H 時間
M
S

上記だと、M が「月」と「分」が被っているため、実際に記述する際は下記のように指定する必要があります。

  • P2M → 2ヶ月
  • PT2M → 2分

当然、表の上から順番に書かないといけないので、P1D2M と書くとエラーになります。

DatePeriodまとめ

DateIntervalの指定などの指定から、出力条件が厳しいため、あまり使用することはないと思います。

使用する際は、end は含まれないことや、DateInterval は表の順番で記述しなければいけない点などに気をつけましょう。

Related