PHPにて指定した期間内の日付を1日ずつループで出力する方法
PHPにて開始日と終了日をユーザが入力すると、その期間内の日付をYYYY-MM-DD形式で1日ずつループで出力させたいというケースがあった。ループで回しながらstrtotimeで1日ずつ追加していけばいいかと思ったけど、他にも何か方法が無いか探したところ良い対応方法があった。以下に対応方法をメモ。
対応方法
パターン1
最初に思いついたパターン。ソースコードをぱっと見た時に何をしているのか(個人的には)分かりやすい。
$start = '2024-01-01'; $end = '2024-01-07'; for( $day = $start; $day <= $end; $day = date('Y-m-d', strtotime($day . '+1 day')) ){ var_dump($day); }
パターン2
DateTimeクラスを使用しつつループで回す方法。これもソースコードをぱっと見た時に何をしているのか(個人的には)分かりやすい。また、パターン1のfor文よりスマートに見える。
$start = new Datetime('2024-01-01'); $end = new Datetime('2024-01-07'); while( $start <= $end ){ var_dump($start->format('Y-m-d')); $start->modify('+1 day'); }
パターン3
DatePeriodクラスを使用しつつループで回す方法。DatePeriodクラスというのを知らなかったのでぱっと見ても何をしているのか分からなかった。
$start = new DateTimeImmutable('2024-01-01T00:00'); $end = new DateTimeImmutable('2024-01-07T24:00'); $interval = new DateInterval('P1D'); $period = new DatePeriod($start, $interval, $end); foreach( $period as $day ){ var_dump($day); }
実行速度
期間を20年分に指定し、それぞれのパターンで数回ほど試したところ以下の実行速度となった。
- パターン1 → 約0.0065秒
- パターン2 → 約0.0034秒
- パターン3 → 約0.002秒
所感
可読性も考慮すると個人的にはパターン2を使っていきたいところ。
関連記事
-
-
PHPにて「php-ulid」ライブラリを用いてULIDを生成する方法
先日MySQLにてUUIDを発行するメモを書いたがUUID v1だと生成時間によ ...
-
-
迷惑メール対策でフォームにGoogle reCAPTCHA v2を導入する方法
お問い合わせフォームのスパムメール対策としてreCAPTCHAを導入したいという ...
-
-
Mailtrap & PHPMailerでメールサーバ無しの環境でもメール送信テストを行う方法
開発環境等メールサーバが無い環境でメール送信テストを行う際にMailtrapとい ...
-
-
ブログサービスの様にサブドメインを動的に生成する方法
ブログサービスの様に「hoge」というログインIDを作成した際「hoge.blo ...
-
-
HTML / CSSで作成したコンテンツをPDFファイルで出力する方法(TCPDF)
HTML / CSSで作成したコンテンツをPDFファイルで出力させたい。以前mp ...