【PHP】今週末の土日の日付を取得する
※本ページのリンクにはプロモーションが含まれています。
こんにちは、Ryohei(@ityryohei)です!
本記事では、PHPで今週末の渡日の日付を取得する方法をご紹介しています。
PHPで今週末の土日の日付を取得したいな。良い方法ないかな?
上記の疑問にお答えします。
では、解説していきます。今週末の土日の日付を取得する
下記のスクリプトで今週末(あるいは指定した日付の週末)の土日の日付を取得することができます。
<?php
// 本日の日付オブジェクトを取得
$datetime = new DateTimeImmutable('Asia/Tokyo');
// 本日の曜日を取得
$dayofweek = $datetime->format('w');
// 今週末 土曜日までの差を取得
$diff = 6 - (int)$dayofweek;
// 今週末 土曜日
$result['saturday'] = $datetime->add(new DateInterval('P'.$diff.'D'));
// 今週末 日曜日
$result['sunday'] = $datetime->add(new DateInterval('P'.($diff+1).'D'));
// 出力
echo $result['saturday']->format('Y-m-d');
echo $result['sunday']->format('Y-m-d');
処理内容は下記の流れとなっています。
- 本日の日付を取得
- 本日の日付の曜日を取得
- 今週末の土曜日までの日付差を取得
DateIntervalで今週末の土曜日までの日数を加算した日付を取得echoにて日付を出力
DateIntervalのインスタンス生成時に引数に指定しているPやDといったプロパティは下記の意味を表しています。
| 間隔 | 説明 |
|---|---|
| P | 間隔を指定する際に最初に記述 |
| Y | 年 |
| D | 日 |
| W | 週(PHP8より前のバージョンではDと併用不可) |
| T | 時分秒を指定する際に最初に記述 |
| H | 時 |
| M | 分 |
| S | 秒 |
Pは間隔の開始に指定するプロパティです。Dは日を指定するプロパティです。そのため上記スクリプトで使用しているP.$diff.Dは、$diff日後の日付を指定する、という意味合いになります。
DateTimeではなくDateTimeImmutableを使う理由について
DateTimeオブジェクトは、addメソッド等で日付の演算を実行すると、オブジェクトの内容が更新されます。
DateTimeの実行例
前項でご紹介したスクリプトの内容をDateTimeオブジェクトに置き換えて実行してみます。
<?php
// 2023年2月8日の日付オブジェクトを取得
$datetime = new DateTime('2023-02-08 Asia/Tokyo');
// 本日の曜日を取得
$dayofweek = $datetime->format('w');
// 今週末 土曜日までの差を取得
$diff = 6 - (int)$dayofweek;
// 今週末 土曜日
$result['saturday'] = $datetime->add(new DateInterval('P'.$diff.'D'));
// 今週末 日曜日
$result['sunday'] = $datetime->add(new DateInterval('P'.($diff+1).'D'));
// 出力
echo $result['saturday']->format('Y-m-d');
echo $result['sunday']->format('Y-m-d');
実行結果は下記の通りです。
2023-02-15 2023-02-15
なぜこんな日付が出力されているのか、各行の演算実行後のダンプを取得して確認してみます。
<?php
$datetime = new DateTime('2023-02-08, Asia/Tokyo');
var_dump($datetime->format('Y-m-d')); // string(10) "2023-02-08"
$dayofweek = $datetime->format('w');
var_dump($dayofweek); // string(3)
$diff = 6 - (int)$dayofweek;
var_dump($diff); // int(3)
$result['saturday'] = $datetime->add(new DateInterval('P'.$diff.'D'));
var_dump($result['saturday']->format('Y-m-d')); // string(10) "2023-02-11"
$result['sunday'] = $datetime->add(new DateInterval('P'.($diff+1).'D'));
var_dump($result['sunday']->format('Y-m-d')); // string(10) "2023-02-15"
上記結果を確認すると、今週末の土曜日までは想定した日付が取得できていますが、日曜日の日付は2023-02-12ではなく、2023-2-15を取得しています。
なぜこのようになっているのかというと、DateTimeオブジェクトはaddメソッドを実行した後に自身の情報を更新したからです。土曜日の日付を取得するためにaddメソッドを実行した後、DateTimeオブジェクトが保持する2023-02-11です。こちらに$diff+1の日数を加算した日付を取得しているため、最終的に2023-02-15の日付が出力されています。
DateTimeImmutableの実行例
DateTimeオブジェクトは、addメソッド等で演算を実行すると、自身の日付を更新することがわかりました。せっかくなので、DateTimeImmutableのダンプも確認してみます。
<?php
$datetime = new DateTimeImmutable('2023-02-08, Asia/Tokyo');
var_dump($datetime->format('Y-m-d')); // string(10) "2023-02-08"
$dayofweek = $datetime->format('w');
var_dump($dayofweek); // string(3)
$diff = 6 - (int)$dayofweek;
var_dump($diff); // int(3)
$result['saturday'] = $datetime->add(new DateInterval('P'.$diff.'D'));
var_dump($result['saturday']->format('Y-m-d')); // string(10) "2023-02-11"
$result['sunday'] = $datetime->add(new DateInterval('P'.($diff+1).'D'));
var_dump($result['sunday']->format('Y-m-d')); // string(10) "2023-02-12"
上記を確認すると、想定した日付情報を取得することができています。一つのオブジェクトを使って、ある日付を基準に日付の加算・減算等を実行する場合は、DateTimeではなくDateTimeImmutableを使う方が良さそうですね。
最後に
PHPで日付を使ったプログラムを組むことは多いです。PHPが組み込みで提供している日付を取扱う関数やクラスは複数ありますので、それぞれの特徴を抑えておくと、よりすっきりしたプログラムが組めるかと思います。本記事がサイト制作やアプリ構築のお役に立てれば幸いです。
以上、PHPで今週末の土日の日付を取得する方法のご紹介でした!