こんにちは、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のインスタンス生成時に引数に指定しているPDといったプロパティは下記の意味を表しています。

間隔説明
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で今週末の土日の日付を取得する方法のご紹介でした!

この記事を書いた人

Ryohei

Webエンジニア / ブロガー

福岡のWeb制作会社に務めるWebエンジニアです。エンジニア歴は10年程で、好きな言語はPHPとJavaScriptです。本サイトは私がインプットしたWebに関する知識を整理し、共有することを目的に2015年から運営しています。Webに関するご相談があれば気軽にお問い合わせください。