1,743


417

C#で誰かの年齢を計算するにはどうすればよいですか?

ある人の誕生日を表す `DateTime`が与えられた場合、年で彼らの年齢をどのように計算しますか?

63 Answer


1,860


わかりやすく簡単な解決策。

// Save today's date.
var today = DateTime.Today;
// Calculate the age.
var age = today.Year  - 生年月日。
// Go back to the year the person was born in case of a leap year
if(誕生日>今日。AddYears(-age))age--;

しかし、これはあなたが_western_の年齢の考えを探していて East Asian reckoningを使用していないと仮定しています。


943


これは奇妙なやり方ですが、日付を `yyyymmdd`にフォーマットして現在の日付から生年月日を引くと、年齢を持っている最後の4桁を落とすことができます:)

C#はわかりませんが、どの言語でも機能すると考えています。

20080814 - 19800703 = 280111

最後の4桁を削除する= 28

C#コード:

int now = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
int dob = int.Parse(dateOfBirth.ToString("yyyyMMdd"));
int age = (now - dob) / 10000;

あるいは、拡張メソッドの形ですべての型変換をすることなく。 エラーチェックを省略:

public static Int32 GetAge(this DateTime dateOfBirth)
{
    var today = DateTime.Today;

    var a = (today.Year * 100 + today.Month) * 100 + today.Day;
    var b = (dateOfBirth.Year * 100 + dateOfBirth.Month) * 100 + dateOfBirth.Day;

    return (a - b) / 10000;
}


361


間違った解決策がどのように受け入れられるのか私は知りません。 正しいC#スニペットは、Michael Stumによって書かれました。

これがテストスニペットです。

DateTime bDay = new DateTime(2000、2、29)。 DateTime now = new DateTime(2009、2、28)。 MessageBox.Show(string.Format( "Test {0} {1} {2}"、// CalculateAgeWrong1(bDay、now)、//出力9 CalculateAgeWrong2(now、now)、//出力9 CalculateAgeCorrect(bDay、now)) ; // 8を出力

ここにあなたは方法があります:

public int CalculateAgeWrong1(DateTime birthDate、DateTime now){新しいDateTimeを返す(now.Subtract(birthDate).Ticks).Year  -  1; }

public int CalculateAgeWrong2(DateTime birthDate、DateTime now){int age = now.Year  -  birthDate.Year;

if(現在<birthDate.AddYears(age))age--;

年齢を返す。 }

public int CalculateAgeCorrect(DateTime birthDate、DateTime now){int age = now.Year  -  birthDate.Year;

if(now.Month <birthDate.Month ||(now.Month == birthDate.Month

年齢を返す。 }


125


私は今までのところ答えのどれもが異なって年齢を計算する文化を提供するとは思わない。 例えば、https://en.wikipedia.org/wiki/East_Asian_age_reckoning [East Asian Age Reckoning]対西欧のそれを参照してください。

すべての答えにローカライゼーションを含める必要があります。 この例では、おそらく Strategy Patternが正しいでしょう。


103


これに対する単純な答えは、以下に示すように `AddYears`を適用することです。これが2月29日に年を追加する唯一のネイティブメソッドだからです。 うるう年の2月28日の正しい結果を得る。 一般的な年のために。

3月1日という人もいます。 .Netも公式の規則もこれを支持していないし、2月に生まれた誰かが別の月にその誕生日の75%を迎える理由は説明できない。

さらに、Ageメソッドは `DateTime`の拡張として追加されるのに適しています。 これにより、最も簡単な方法で年齢を取得できます。

  1. リスト項目

    • int age = birthDate.Age(); *

public static class DateTimeExtensions
{
    ///
    /// Calculates the age in years of the current System.DateTime object today.
    ///
    /// The date of birth
    /// Age in years today. 0 is returned for a future date of birth.
    public static int Age(this DateTime birthDate)
    {
        return Age(birthDate, DateTime.Today);
    }

    ///
    /// Calculates the age in years of the current System.DateTime object on a later date.
    ///
    /// The date of birth
    /// The date on which to calculate the age.
    /// Age in years on a later day. 0 is returned as minimum.
    public static int Age(this DateTime birthDate, DateTime laterDate)
    {
        int age;
        age = laterDate.Year - birthDate.Year;

        if (age > 0)
        {
            age -= Convert.ToInt32(laterDate.Date < birthDate.Date.AddYears(age));
        }
        else
        {
            age = 0;
        }

        return age;
    }
}

それでは、このテストを実行してください。

class Program
{
    static void Main(string[] args)
    {
        RunTest();
    }

    private static void RunTest()
    {
        DateTime birthDate = new DateTime(2000, 2, 28);
        DateTime laterDate = new DateTime(2011, 2, 27);
        string iso = "yyyy-MM-dd";

        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                Console.WriteLine("Birth date: " + birthDate.AddDays(i).ToString(iso) + "  Later date: " + laterDate.AddDays(j).ToString(iso) + "  Age: " + birthDate.AddDays(i).Age(laterDate.AddDays(j)).ToString());
            }
        }

        Console.ReadKey();
    }
}

重要な日付の例はこれです。

*生年月日:2000-02-29後日:2011-02-28年齢:11 *

出力:

{
    Birth date: 2000-02-28  Later date: 2011-02-27  Age: 10
    Birth date: 2000-02-28  Later date: 2011-02-28  Age: 11
    Birth date: 2000-02-28  Later date: 2011-03-01  Age: 11
    Birth date: 2000-02-29  Later date: 2011-02-27  Age: 10
    Birth date: 2000-02-29  Later date: 2011-02-28  Age: 11
    Birth date: 2000-02-29  Later date: 2011-03-01  Age: 11
    Birth date: 2000-03-01  Later date: 2011-02-27  Age: 10
    Birth date: 2000-03-01  Later date: 2011-02-28  Age: 10
    Birth date: 2000-03-01  Later date: 2011-03-01  Age: 11
}

そして後日2012-02-28:

{
    Birth date: 2000-02-28  Later date: 2012-02-28  Age: 12
    Birth date: 2000-02-28  Later date: 2012-02-29  Age: 12
    Birth date: 2000-02-28  Later date: 2012-03-01  Age: 12
    Birth date: 2000-02-29  Later date: 2012-02-28  Age: 11
    Birth date: 2000-02-29  Later date: 2012-02-29  Age: 12
    Birth date: 2000-02-29  Later date: 2012-03-01  Age: 12
    Birth date: 2000-03-01  Later date: 2012-02-28  Age: 11
    Birth date: 2000-03-01  Later date: 2012-02-29  Age: 11
    Birth date: 2000-03-01  Later date: 2012-03-01  Age: 12
}


79


私のおすすめ

int age =(int)((DateTime.Now  -  bday).TotalDays / 365.242199);

それは正しい年に変わる年を持っているようです。 (107歳までのスポットテスト)


69


私の手ではなく、ウェブ上で見つけてそれを少し洗練したもう一つの機能:

public static int GetAge(DateTime birthDate){DateTime n = DateTime.Now;} //真夜中頃の競合状態を回避するint int = n.Year  -  birthDate.Year;

if(n.Month <birthDate.Month ||(n.Month == birthDate.Month

年齢を返す。 }

私の頭に浮かぶ2つだけのこと:グレゴリオ暦を使用していない国から来た人々はどうですか? DateTime.Nowは私が思うサーバー固有のカルチャにあります。 私はアジアのカレンダーを実際に扱うことについては全く知識がなく、カレンダー間で日付を変換する簡単な方法があるかどうかはわかりませんが、念のために4660年以降の中国人について考えてみてください。


47


2解決すべき主な問題は以下のとおりです。

  • 1 正確な年齢*を計算する - 年、月、日などで。

  • 2 一般的に認められている年齢*を計算します - 人々は通常自分が何歳であるかを気にしません、彼らは今年の彼らの誕生日がいつであるかを気にします。

'' '' '

  • 1 *に対する解決策は明白です:

DateTimeの生年月日= DateTime.Parse( "1.1.2000");今日のDateTime = DateTime.Today; //私たちは通常、誕生時間を気にしません。TimeSpan年齢=今日 - 誕生。 // .NET FCLは、これを正確な倍精度として保証する必要があります。ageInDays = age.TotalDays; //合計日数... また、正確な2日間の年数は365.2425です。 // 400年間の統計値double ageInYears = ageInDays / daysInYear; //シフト可能 あまり正確ではない

'' '' '

  • 2 *の解決策は、総年齢を判断するのにはそれほど正確ではありませんが、人々からは正確であると認識されるものです。 人々は彼らの年齢を "手動で"計算するときにも通常それを使用します。

DateTimeの生年月日= DateTime.Parse( "1.1.2000");今日のDateTime = DateTime.Today; int age =今日。年 - 生年月日。 //人々は年齢で年を知覚する

if(today.Month <birth.Month ||((today.Month == birth.Month) みんな... すみません、生年月日が間違っています}

2のメモ:

  • これが私の推奨する解決策です

  • DateTime.DayOfYearやTimeSpansはうるう年の日数をずらすため使用できません。

  • 読みやすさのためにもう少し行を追加しました

もう1つ注意してください…​ 私はそれのために2つの静的なオーバーロードされたメソッドを作成します。

public static int GetAge(DateTime bithDay、DateTime today){//選択されたソリューションメソッド本体}

public static int GetAge(DateTime birthDay){return GetAge(birthDay、DateTime.Now); }


45


私はパーティーに遅刻しました、しかしここにワンライナーがあります:

int age = new DateTime(DateTime.Now.Subtract(birthday).Ticks).Year-1;


36


これは私たちがここで使っているバージョンです。 それはうまくいきます、そしてそれはかなり単純です。 これはJeffのものと同じアイデアですが、1を引くためのロジックを分離しているので、もう少し明確になっていると思うので、理解するのは少し簡単です。

public static int GetAge(this DateTime dateOfBirth, DateTime dateAsAt)
{
    return dateAsAt.Year - dateOfBirth.Year - (dateOfBirth.DayOfYear < dateAsAt.DayOfYear ? 0 : 1);
}

そのようなことがはっきりしないと思うならば、あなたはそれをさらに明確にするために三項演算子を拡張することができます。

明らかにこれは `DateTime`の拡張メソッドとして行われますが、明らかにあなたはその仕事をする1行のコードをつかみ、それをどこにでも置くことができます。 ここで、完全を期すために、 `DateTime.Now`を渡すExtensionメソッドの別のオーバーロードがあります。