0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【PHP】組み込み関数で数か月前の日にちを取得する

Posted at

PHPの日付を求める組み込み関数はバグが存在するので単純にstrtotime()で"-1 month"の様に
フォーマットを指定するだけではうまくいかない

そのため、以下の手順で求めていく
例として今日から3ヵ月前を求める場合

①今日の月初の日にちを求める(1日)
②月初の日を元に、3ヵ月前の月を取得
③3ヵ月前の月の日を今日の日にする。
③ー2 3ヵ月前末日と今月末日の日にちが一致しない場合(ex:05-31と02-28など)3ヵ月前末日を代入

例:3ヵ月前の場合

//3ヵ月以上経過しているかチェックする
function chkThreeMonth($targetDate) {
  // 本日の日付を比較日の日付に仮設定
  $comparedDate = date("d", strtotime("today"));
  // 今月の月初
  $firstDate = date("Y-m-d", strtotime('first day of this month'));
  // 比較月の年月
  $comparedYearMonth = date("Y-m", strtotime($firstDate . '-3 month')); 
  // 比較月の末日
  $comparedLastDate = date('d', strtotime('last day of ' . $comparedYearMonth));

  // 比較月の末日が本日より小さいなら末日を比較日に設定
  if($comparedLastDate < $comparedDate){
    $comparedDate = $comparedLastDate;
  }
  // 比較結果
  return strtotime(sprintf('%s-%02d', $comparedYearMonth, $comparedDate)) > strtotime($targetDate);
}

// もしくは
// strtotime(sprintf('%s-%02d', $comparedYearMonth, $comparedDate)) >= strtotime($targetDate)と同等
function chkPassedThreeMonth(DateTime $targetDate) {
  $baseDate = new DateTime();
  return $baseDate->diff($targetDate)->format('%m') > 2;
}

// strtotime(sprintf('%s-%02d', $comparedYearMonth, $comparedDate)) > strtotime($targetDate)と同等
function chkPassedThreeMonth(DateTime $targetDate) {
  $baseDate = new DateTime('yesterday');
  return $baseDate->diff($targetDate)->format('%m') > 2;
}
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?