Laravelで入力された日付から年度とさらに和暦に変換する方法
はじめに
業務で日付データから、年度を西暦と和暦で表示する機会があったので、今回は備忘録の意味も込めて書いていきたいと思います!
年度を算出する
年度を算出する際に厄介に感じるのは、1月~3月の実際の年と年度が異なる時だと思います。
しかし、年度を算出する際には、算出元の日付から-3ヶ月した月の年を年度と考えればいいので、意外とシンプルです。
$now = CarbonImmutable::now(); // ex) 2022-03-01
$fiscal_year = $now->subMonthNoOverflow(3)->format('Y'); // 2021
上記の例だと、2022年3月31日の3ヶ月前である2021年12月31日を取得し、その年(2021年)が年度に当たると考えることができます。
また、subMonthNoOverflow()
は引数の数だけ、日付あふれを考慮しながら月単位で減らしてくれるメソッドです。
日付あふれと言うのは、例えば3月31日の1ヶ月前を算出する時に、日付あふれを考慮しないと3月3日が1ヶ月前となってしまいます。
しかしsubMonthNoOverflow()
は日付あふれを考慮してくれるため、3月31日の1ヶ月前を算出する場合は自動的に2月28日としてくれメソッドです。
西暦を和暦に変換する
先ほど算出した年度を使用し、続いては西暦を和暦に変換したいと思います。
まずは、明治から令和までの年範囲を定義します。
ここで注意しなくてはいけないのが、元年の扱いです。
年度は4月1日時点での元号の年がそのまま年度として3月31日まで使用されます。
令和は2019年5月1日から始まったので、
2019年4月1日から2020年3月31日 → 平成31年度
2020年4月1日から2021年3月31日 → 令和2年度
となり、令和元年度は存在しないことになります。
しかし、平成は元年度が存在し、昭和は元年度が存在せず、昭和が始まった1926年は大正15年度となります。
なので、各元号が始まった年に関しては、初めから定義してしまうこととします。
$eras = [
['year' => 2019, 'name' => '令和', 'new_Japanese_calendar' => '平成31年度'],
['year' => 1989, 'name' => '平成', 'new_Japanese_calendar' => '平成元年度'],
['year' => 1926, 'name' => '昭和', 'new_Japanese_calendar' => '大正15年度'],
];
続いて、先ほど算出した$fiscal_year
を使用し、西暦を和暦に変換します。
// $fiscal_year = 2021
foreach ($eras as $era) {
if ($fiscal_year === $era['year']) {
return $era['new_Japanese_calendar'];
}
if ($fiscal_year >= $era['year']) {
$year = $fiscal_year - $era['year'] + 1;
return $era['name'] . $year . '年度'; // 令和3年度
}
}
これで和暦で年度を表示することができました!
しかし、1点注意しなくてはいけないのが、令和元年度の扱いです。
先ほどは令和元年度は存在しないと説明しましたが、下記サイトによると、国が行う「会計年度」に限って「令和元年度」を認めるそうです。
「令和元年度」と「平成31年度」機関はいつからいつまで?どちらが正しい?
そのため、サービスによっては「令和元年度」を利用する場合もあるかもしれないので、確認が必要かもしれないですね!
終わりに
今回は日付から年度を算出する方法、そこから和暦に変換する方法を見ていきました!
年度や和暦に変換する計算方法は意外とシンプルなので、年度だけでなく様々な場面で利用できそうだと思いました。
最後まで読んでいただきありがとうございました!
参考
Discussion