生年月日から年齢を計算する方法をいくつか紹介します。なお、ここでは主に満年齢の計算方法を紹介し、最後に少しだけ数え年の計算方法についても触れます。
年齢について詳しくは、以下のリンク先を参考にしてください。
皆さんは生年月日から年齢を計算する時、どのようにされるでしょうか?普通は、まず現在の年から生年月日の年を引いた数を求め、もし今年の誕生日がすでに来ているのであればその数を年齢とし、来ていなければその数から1つ引いた数を年齢とするのではないでしょうか。
この方法で年齢を計算した例を以下に示します。
''' <summary> ''' 生年月日から年齢を計算する ''' </summary> ''' <param name="birthDate">生年月日</param> ''' <param name="today">現在の日付</param> ''' <returns>年齢</returns> Public Shared Function GetAge(ByVal birthDate As DateTime, _ ByVal today As DateTime) As Integer Dim age As Integer = today.Year - birthDate.Year '誕生日がまだ来ていなければ、1引く If today.Month < birthDate.Month OrElse _ (today.Month = birthDate.Month AndAlso _ today.Day < birthDate.Day) Then age -= 1 End If Return age End Function
/// <summary> /// 生年月日から年齢を計算する /// </summary> /// <param name="birthDate">生年月日</param> /// <param name="today">現在の日付</param> /// <returns>年齢</returns> public static int GetAge(DateTime birthDate, DateTime today) { int age = today.Year - birthDate.Year; //誕生日がまだ来ていなければ、1引く if (today.Month < birthDate.Month || (today.Month == birthDate.Month && today.Day < birthDate.Day)) { age--; } return age; }
このメソッドの使用例を以下に示します。
'生年月日が2000年2月29日 Dim birthDate As New DateTime(2000, 2, 29) '現在の日付 Dim today As DateTime = DateTime.Today '年齢を計算する Dim age As Integer = GetAge(birthDate, today)
//生年月日が2000年2月29日 DateTime birthDate = new DateTime(2000, 2, 29); //現在の日付 DateTime today = DateTime.Today; //年齢を計算する int age = GetAge(birthDate, today);
上記の方法では月と日にちを調べて年齢を調節していますが、実際に年齢を現在の日付から引いてみて、誕生日より前になれば1を引くという方法も考えられます。この場合は、以下の様なコードになります。
''' <summary> ''' 生年月日から年齢を計算する ''' </summary> ''' <param name="birthDate">生年月日</param> ''' <param name="today">現在の日付</param> ''' <returns>年齢</returns> Public Shared Function GetAge(ByVal birthDate As DateTime, _ ByVal today As DateTime) As Integer Dim age As Integer = today.Year - birthDate.Year '現在の日付から年齢を引いた日付が誕生日より前ならば、1引く If today.AddYears(-age) < birthDate Then age -= 1 End If Return age End Function
/// <summary> /// 生年月日から年齢を計算する /// </summary> /// <param name="birthDate">生年月日</param> /// <param name="today">現在の日付</param> /// <returns>年齢</returns> public static int GetAge(DateTime birthDate, DateTime today) { int age = today.Year - birthDate.Year; //現在の日付から年齢を引いた日付が誕生日より前ならば、1引く if (today.AddYears(-age) < birthDate) { age--; } return age; }
注意が必要なのは、生年月日に年齢を足した日付と現在の日付を比較する方法は正しくないということです。このことは「.net - How do I calculate someone's age in C#?」で指摘されており、例えば2000/02/29生まれの人の年齢を正しく計算できなくなります。
これも「.net - How do I calculate someone's age in C#?」で紹介されている方法です。
例えば現在の日付が 2012/9/21 で、生年月日が 1980/4/6 だとすると、20120921 から 19800406 を引いた数 320515 の末尾の4つの数字を削除した数 32 が年齢になるということです。
この方法を使ったコードの例は、以下のようになります。
''' <summary> ''' 生年月日から年齢を計算する ''' </summary> ''' <param name="birthDate">生年月日</param> ''' <param name="today">現在の日付</param> ''' <returns>年齢</returns> Public Shared Function GetAge(ByVal birthDate As DateTime, _ ByVal today As DateTime) As Integer Return ((today.Year * 10000 + today.Month * 100 + today.Day) - _ (birthDate.Year * 10000 + birthDate.Month * 100 + birthDate.Day)) \ 10000 End Function
/// <summary> /// 生年月日から年齢を計算する /// </summary> /// <param name="birthDate">生年月日</param> /// <param name="today">現在の日付</param> /// <returns>年齢</returns> public static int GetAge(DateTime birthDate, DateTime today) { return ((today.Year * 10000 + today.Month * 100 + today.Day) - (birthDate.Year * 10000 + birthDate.Month * 100 + birthDate.Day)) / 10000; }
数え年では、生まれた年が1歳で、元日に1歳年を取ります。ですので、グレゴリオ暦だけ考慮すれば良いのであれば、計算は非常に簡単です。
以下に、グレゴリオ暦だけを考慮して数え年を計算する例を示します。
''' <summary> ''' 生年月日から数え年を計算する ''' </summary> ''' <param name="birthDate">生年月日</param> ''' <param name="today">>現在の日付</param> ''' <returns>年齢</returns> Public Shared Function GetKazoedoshi(ByVal birthDate As DateTime, _ ByVal today As DateTime) As Integer Return today.Year - birthDate.Year + 1 End Function
/// <summary> /// 生年月日から数え年を計算する /// </summary> /// <param name="birthDate">生年月日</param> /// <param name="today">>現在の日付</param> /// <returns>年齢</returns> public static int GetKazoedoshi(DateTime birthDate, DateTime today) { return today.Year - birthDate.Year + 1; }
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。