🏯

Laravelで入力された日付から年度とさらに和暦に変換する方法

2022/02/21に公開

はじめに

業務で日付データから、年度を西暦と和暦で表示する機会があったので、今回は備忘録の意味も込めて書いていきたいと思います!

年度を算出する

年度を算出する際に厄介に感じるのは、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年度」機関はいつからいつまで?どちらが正しい?

そのため、サービスによっては「令和元年度」を利用する場合もあるかもしれないので、確認が必要かもしれないですね!

終わりに

今回は日付から年度を算出する方法、そこから和暦に変換する方法を見ていきました!
年度や和暦に変換する計算方法は意外とシンプルなので、年度だけでなく様々な場面で利用できそうだと思いました。

最後まで読んでいただきありがとうございました!

参考

https://blog.capilano-fw.com/?p=3307

Discussion