DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

生年月日から年齢を計算する

生年月日から年齢を計算するのは簡単そうで、意外と難しいです。まず年齢の数え方が幾つもあります。一般的なのは、満年齢と数え年です。さらに満年齢であっても、誕生日に1歳年を取る数え方と、誕生日の前日に1歳年を取る数え方があります。前者の方が一般的のように思えますが、実は日本の法律では後者の方が一般的らしいです。

そこでここでは、単に「年齢」と言った場合は前者を、「法令上の満年齢」と言った場合は後者を指すものとし、主に年齢の計算方法について考えていきます。

なお年齢について詳しくは、以下のリンク先を参考にしてください。

普通に計算する方法

皆さんは生年月日から年齢を計算する時、どのようにされるでしょうか?普通は、まず現在の年から生年月日の年を引いた数を求め、もし今年の誕生日がすでに来ているのであればその数を年齢とし、来ていなければその数から1つ引いた数を年齢とするのではないでしょうか。

この方法で年齢を計算した例を以下に示します。

VB.NET
コードを隠すコードを選択
''' <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
C#
コードを隠すコードを選択
/// <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;
}

このメソッドの使用例を以下に示します。

VB.NET
コードを隠すコードを選択
'生年月日が2000年2月29日
Dim birthDate As New DateTime(2000, 2, 29)
'現在の日付
Dim today As DateTime = DateTime.Today

'年齢を計算する
Dim age As Integer = GetAge(birthDate, today)
C#
コードを隠すコードを選択
//生年月日が2000年2月29日
DateTime birthDate = new DateTime(2000, 2, 29);
//現在の日付
DateTime today = DateTime.Today;

//年齢を計算する
int age = GetAge(birthDate, today);

仮に算出した年を現在の日付から引いて生年月日と比較する方法

上記の方法では月と日にちを調べて年齢を調節していますが、実際に年齢を現在の日付から引いてみて、誕生日より前になれば1を引くという方法も考えられます。この場合は、以下の様なコードになります。

VB.NET
コードを隠すコードを選択
''' <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
C#
コードを隠すコードを選択
/// <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生まれの人の年齢を正しく計算できなくなります。

日付を8桁の整数にして引き算する方法

これも「.net - How do I calculate someone's age in C#?」で紹介されている方法です。

例えば現在の日付が 2012/9/21 で、生年月日が 1980/4/6 だとすると、20120921 から 19800406 を引いた数 320515 の末尾の4つの数字を削除した数 32 が年齢になるということです。

この方法を使ったコードの例は、以下のようになります。

VB.NET
コードを隠すコードを選択
''' <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
C#
コードを隠すコードを選択
/// <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日足したものを現在の日付として計算すればよいということになります。

なお、生年月日から1日引いたものを生年月日として年齢を計算し、それを法令上の満年齢とすると、生年月日の前日が2月29日だった場合に正しい結果を返さない可能性があります。

以下に、上記のGetAgeメソッドを使って法令上の満年齢を計算する例を示します。

VB.NET
コードを隠すコードを選択
''' <summary>
''' 生年月日から法令上の満年齢を計算する
''' </summary>
''' <param name="birthDate">生年月日</param>
''' <param name="today">現在の日付</param>
''' <returns>年齢</returns>
Public Shared Function GetMannenrei(ByVal birthDate As DateTime, _
                                    ByVal today As DateTime) As Integer
    Return GetAge(birthDate, today.AddDays(1))
End Function
C#
コードを隠すコードを選択
/// <summary>
/// 生年月日から法令上の満年齢を計算する
/// </summary>
/// <param name="birthDate">生年月日</param>
/// <param name="today">現在の日付</param>
/// <returns>年齢</returns>
public static int GetMannenrei(DateTime birthDate, DateTime today)
{
    return GetAge(birthDate, today.AddDays(1));
}

数え年を計算する

数え年では、生まれた年が1歳で、元日に1歳年を取ります。ですので、グレゴリオ暦だけ考慮すれば良いのであれば、計算は非常に簡単です。

以下に、グレゴリオ暦だけを考慮して数え年を計算する例を示します。

VB.NET
コードを隠すコードを選択
''' <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
C#
コードを隠すコードを選択
/// <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;
}

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。