PHPのDatePeriodでエラーが発生しない記述方法まとめ
2019.08.11
カレンダーを作成する際に使用した 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 は表の順番で記述しなければいけない点などに気をつけましょう。