Help us understand the problem. What is going on with this article?

PHPで今日の日時から過去直近のX曜日の日時を取得する

こんにちは!
今回は、PHPで過去の直近の任意曜日は何日だったかを取得する方法を紹介します。
例えば、1/21(月) ~ 1/28(月) の期間で過去の直近の月曜日を取得したいと考えると、

  • 1/21(月)ならその日が月曜なので1/21(月)
  • 1/22(火) ~ 1/27(日)なら1/21(月)
  • 1/28(月)ならその日が月曜なので1/28(月)

をそれぞれ取得できるといった具合です。
例えば、毎週X曜日ごとに切り替わるシステム(今週のMVPを決めるよ~とかw)などを作る際に、
最近最後のN曜日って何日だったかなーって時に使うイメージです。

サンプルコード

例として、今日の日時から過去直近の月曜は何日だったかを求めてみます。

// 今日は2019/01/21 月曜日だったと仮定します
$now = new DateTime();

$w = date('w', $now->getTimestamp());
$diff = ($w + 6) % 7;

// 今日の日時から$diff日前に遡る
$ymd = date('Y/m/d', strtotime("-{$diff} day", $now->getTimestamp()));

print_r($ymd);

// 結果: 2019/01/21

解説

date('w', \$timestamp)では、
\$timestampで与えられた日時に対して、その日が日曜日なら0、月曜なら1、火曜なら2...土曜なら6といった数値を返してくれます。

今回の例では、直近の月曜日を取得したかったので月曜なら0日前、火曜なら1日前、...日曜なら6日前に遡るように$diffの計算時に、+Nする値を調整(\$w=1なので\$wに+6して曜日数(=7)で割った余りが0になるように)しています。

したがって, 仮に直近の火曜日を取得したいよーという場合は、\$diffを求める際に+6している部分を+5、
水曜なら+4、...日曜なら+0と調整すると直近の任意の曜日の日付を取得することができます。

ひとこと

日付はなんかややこしいよね(´・ω・`)

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away