# 内容
Laravelで日付操作を行う際は、Carbonを利用されるかと思います。
Carbonには、diffInYears()という関数が用意されており、年単位の差を判定してくれます。
以下に例を示します。
$case1 = new Carbon('2020-01-01');
$case2 = new Carbon('2020-12-31');
\Log::debug('差分は ' . $case1->diffInYears($case2) . ' です');
$case3 = new Carbon('2020-01-01');
$case4 = new Carbon('2021-01-01');
\Log::debug('差分は ' . $case3->diffInYears($case4) . ' です');
$case5 = new Carbon('2019-03-01');
$case6 = new Carbon('2020-02-29');
\Log::debug('差分は ' . $case5->diffInYears($case6) . ' です');
> local.DEBUG: 差分は 0 です
> local.DEBUG: 差分は 1 です
> local.DEBUG: 差分は 1 です
上述の結果から、お気づきかもしれませんが、「2019/03/01」~「2020/02/29」の差分を1年と判定してしまいます。
厳密に1年のバリデーションを行いたい場合はdiffInYearsではうるう年を考慮することができません。
# 解決策
力技になってしまうのですが、以下のようにうるう年(02/29)を除外してカウントするカスタムバリデーションを作成しました。
// 日付Fromと日付Toを比較して1年を超えるかチェック
Validator::extend(
'withinOneYear',
function ($attribute, $value, $parameters, $validator) {
$dateFrom = new Carbon($value);
$dateTo = new Carbon($parameters[0]);
// うるう年の対策処理
$diffDays = Carbon::parse($dateFrom)->diffInDaysFiltered(function (Carbon $date) {
// 2/29を除外
return $date->format('m-d') != '02-29';
},
Carbon::parse($dateTo->addDay(1)));
return !($diffDays > 365);
}
);