ロジックや解説に関しては以下を参照のこと
まだ年齢計算で消耗してるの? - Qiita
https://qiita.com/kawasima/items/8fdd3939be151f33f7cf
年齢計算は日本の場合は、「年齢計算ニ関スル法律」に基づいた計算になります。
ここで、大きく別れるのが、時刻基準で計算するか日基準で計算するかです。
一般的には時刻基準で計算するので、4月1日生まれの人は、4月1日の0時ちょうどに歳をとることにすればよいですが…、日基準の場合には誕生日前日に歳をとることになります。日基準で計算される有名なのは学齢がありますが、選挙権なんかも同じく日基準のようです。
この民法第143条の日基準の年齢計算のロジックは参照先の通りいくつかあるが、毎度ながらテストケースに迷うのでメモ。
誕生日 | 歳を重ねる日 | 誕生日がうるう年か | 基準日 | 基準年の歳を重ねる日 | 基準日がうるう年か | 年齢 |
---|---|---|---|---|---|---|
2012/3/1 | 2/28 or 2/29 | ○ | 2016/2/28 | 2016/2/29 | ○ | 3 |
2012/3/1 | 2/28 or 2/29 | ○ | 2016/2/29 | 2016/2/29 | ○ | 4 |
2012/3/1 | 2/28 or 2/29 | ○ | 2017/2/28 | 2017/2/28 | - | 5 |
2013/4/6 | 4/5 | - | 2017/4/6 | 2017/4/5 | - | 4 |
2013/4/6 | 4/5 | - | 2017/4/5 | 2017/4/5 | - | 4 |
2013/4/6 | 4/5 | - | 2017/4/4 | 2017/4/5 | - | 3 |
2013/3/1 | 2/28 or 2/29 | - | 2016/2/28 | 2016/2/29 | ○ | 2 |
2013/3/1 | 2/28 or 2/29 | - | 2016/2/29 | 2016/2/29 | ○ | 3 |
参照元のソースを基にC#版の民法第143条の日基準の年齢計算
public static int CalcAge(this DateTime birthday, DateTime baseDate = new DateTime())
{
var calcBaseDate = baseDate.AddDays(1);
return (int.Parse(calcBaseDate.ToString("yyyyMMdd")) - int.Parse(birthday.ToString("yyyyMMdd"))) / 10000;
}
追記:
世の中にある年齢計算のツールは、ほとんどが時間基準の年齢計算なので、結果が違うんですよね。
上記のケースを、試しに入力してみるといくつかのケースで結果が異なるはず。
いま,何歳? - 高精度計算サイト
http://keisan.casio.jp/exec/system/1233283157
年齢計算機/年齢早見表
http://www5d.biglobe.ne.jp/Jusl/Keisanki/JTSL/nenrei.html