【PHP実践|実務向け】PHPで「直近の指定曜日」を正確に算出する実装テクニック

導入

実務において「先週の金曜日」や「直近の月曜日」など、特定の曜日を基準にした日付算出は、日報システムや集計バッチ処理で頻繁に求められる要件です。PHPのdate関数やmktime関数をそのまま扱うと、月末や月初のまたぎ処理で計算が複雑になりがちです。今回は、シンプルかつ堅牢に「直近の指定曜日」を算出する実装方法を解説します。

基礎知識

PHPで日付を扱う際、最も基本的な関数はdate()です。特に曜日を取得する際は引数に”w”を指定し、0(日曜日)から6(土曜日)の数値で取得するのが一般的です。今回解説するロジックは、現在の曜日とターゲットの曜日の差分を算出し、その差分だけ日数を加減算することでターゲットの日付を導き出すという手法です。

実装/解決策

単純な加減算で実装する場合、曜日の差がマイナスになるケース(例:今日が水曜日で、ターゲットが金曜日の場合など)を考慮する必要があります。また、PHP 5.2以降であればDateTimeクラスを利用する方が、可読性やメンテナンス性の観点から推奨されます。今回は、実務で汎用的に使えるDateTimeクラスを用いた実装案を紹介します。

サンプルプログラム

以下のコードは、DateTimeクラスを使用して「指定した曜日(0:日~6:土)」の直近日付を取得する実用的な関数です。

  • 指定した曜日の日付を取得する関数
  • @param int $targetDay 0(日)~6(土)
  • @return string Y-m-d形式の日付
  • /
    function getTargetDayDate(int $targetDay): string
    {
    // 現在時刻でDateTimeオブジェクトを生成
    $date = new DateTime();

    // 現在の曜日を取得
    $currentDay = (int)$date->format(‘w’);

    // 差分を計算(ターゲットから現在を引く)
    $diff = $targetDay – $currentDay;

    // 直近の日付を求めるため、差分が正(未来)であれば1週間前へ戻す調整を行う
    // ※「過去の直近」を求めるためのロジックです
    if ($diff >= 0) {
    $diff -= 7;
    }

    // 日付を修正
    $date->modify($diff . ‘ days’);

    return $date->format(‘Y-m-d’);
    }

    // 例:直近の火曜日(2)を取得
    echo “直近の火曜日の日付: ” . getTargetDayDate(2);
    ?>

    応用・注意点

    1. タイムゾーンの考慮: 実務環境ではサーバーのタイムゾーン設定(date.timezone)が意図したものになっているか必ず確認してください。予期せぬ日付のズレを防ぐため、アプリ内でdate_default_timezone_set()を明示的に指定するのが安全です。
    2. DateTimeクラスの利点: 参考例のようなmktime関数を用いた計算は、直感的ですが月末またぎの計算でバグを生みやすいです。DateTimeクラスのmodifyメソッドを使うと、PHP内部でカレンダー計算を適切に処理してくれるため、極力こちらの利用を推奨します。
    3. エラーログについて: 提示された参考コード内に「count(): Parameter must be an array…」というWarningが出ていますが、これは引数が配列ではない場合に発生する典型的なエラーです。実務では、外部から取得した値が期待通りの型であるか、is_array()や型ヒントを活用してガード節を設けることが、堅牢なコードへの第一歩となります。

    タイトルとURLをコピーしました