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;
}