CSharp - C#中如何计算某个人的年龄

  显示原文与译文双语对照的内容

给定代表某人生日的DateTime,如何计算他们的年龄?

时间:

原因是jeff的代码似乎不够简单。 对于我来说,这看起来更简单更容易理解:


DateTime today = DateTime.Today;
int age = today.Year - bday.Year;
if (bday> today.AddYears(-age)) age--;

然而,这假设你正在寻找西方的年龄,而不是使用东亚的计算

这是一种奇怪的方法,但是如果你格式化日期到 yyyymmdd 并从当前日期减去出生日期,那么最后的4位数字就会丢失:)

我不知道 C#,但我相信这可以用任何语言。


20080814 - 19800703 = 280111 

除去最后 4位数字= 28

C# 代码:


var now = float.Parse(DateTime.Now.ToString("yyyy.MMdd"));
var dob = float.Parse(dateOfBirth.ToString("yyyy.MMdd"));
var age = (int)(now - dob);

或者不使用扩展方法形式的所有类型转换。 检查省略时出错:


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;
}

我不知道如何接受错误的解决方案。 正确的C# Fragment由 Michael Stum编写

下面是一个测试 Fragment:


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),//outputs 9
 CalculateAgeWrong2(bDay, now),//outputs 9
 CalculateAgeCorrect(bDay, now)));//outputs 8

下面是这些方法:


public int CalculateAgeWrong1(DateTime birthDate, DateTime now)
{
 return new DateTime(now.Subtract(birthDate).Ticks).Year - 1;
}

public int CalculateAgeWrong2(DateTime birthDate, DateTime now)
{
 int age = now.Year - birthDate.Year;
 if (now <birthDate.AddYears(age)) age--;
 return age;
}

public int CalculateAgeCorrect(DateTime birthDate, DateTime now)
{
 int age = now.Year - birthDate.Year;
 if (now.Month <birthDate.Month || (now.Month == birthDate.Month && now.Day <birthDate.Day)) age--;
 return age;
}

我不认为目前的任何答案都提供了对年龄不同的区域性。 例如东亚年龄推算与西方。

任何的答案都必须包括本地化。 在本例中,策略模式 。可能是按顺序排列的。

最简单的答案到这是以应用 AddYears 如下所示,因为这是唯一原生的29将年添加到这一实际问题的出口工作。 闰年并获得 28年Feb的正确结果。 用于常见年份。

有些人认为,市场是 1. 生日是leaplings是否任何支持这种,一般逻辑解释为什么有些出生在二月也没规定但是无论. NET 还是应该公开他们的75%生日在另一个月。

此外,Age方法还将它的作为扩展添加到 DateTime 。 通过这种方式,你可以最简单的方式获得年龄:

  1. List 项目

年的int = birthDate.Age();


public static class DateTimeExtensions
{
///<summary>
///Calculates the age in years of the current System.DateTime object today.
///</summary>
///<param name="birthDate">The date of birth</param>
///<returns>Age in years today. 0 is returned for a future date of birth.</returns>
 public static int Age(this DateTime birthDate)
 {
 return Age(birthDate, DateTime.Today);
 }
///<summary>
///Calculates the age in years of the current System.DateTime object on a later date.
///</summary>
///<param name="birthDate">The date of birth</param>
///<param name="laterDate">The date on which to calculate the age.</param>
///<returns>Age in years on a later day. 0 is returned as minimum.</returns>
 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();
 }
}

关键日期示例如下:

出生日期:1 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
}

于最后一版相关 and:


{
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
}

我的建议


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

这似乎在正确的日期改变了年份。 ( 我测试了年龄 107 )

我迟到了,但这里是一个 one-liner:


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

要解决的主要问题是:

以年。月。日。etc, 1.计算确切年龄 -.

当前年份中 is, 2.计算一般情况下感知时代 - 人们通常不关心他们究竟是多大,他们只是小心确认它的birthday.


1的解决方案显而易见:


DateTime birth = DateTime.Parse("1.1.2000");
DateTime today = DateTime.Today;//we usually don't care about birth time
TimeSpan age = today - birth;//.NET FCL should guarantee this as precise
double ageInDays = age.TotalDays;//total number of days.. . also precise
double daysInYear = 365.2425;//statistical value for 400 years
double ageInYears = ageInDays/daysInYear;//can be shifted.. . not so precise


2 是石斛这是不那么精确的那个年龄总数,但是一直被认为精确的受重视。 在计算年龄"手工"时,人们通常也使用它:


DateTime birth = DateTime.Parse("1.1.2000");
DateTime today = DateTime.Today;
int age = today.Year - birth.Year;//people perceive their age in years
if (
 today.Month <birth.Month 
 ||
 ((today.Month == birth.Month) && (today.Day <birth.Day))
 )
{
 age--;//birthday in current year not yet reached, we are 1 year younger ;)
//+ no birthday for 29.2. guys.. . sorry, just wrong date for birth
}

对 2的说明:

  • 这是我的首选解决方案
  • 我们不能使用 DateTime.DayOfYear 或者 TimeSpans,因为它们在闰年内移动天数
  • 我已经放置了更多的代码行用于可读性

请再注意一点。。 我将为它创建 2个静态重载方法,一个用于通用使用,第二个用于 usage-friendliness:


public static int GetAge(DateTime bithDay, DateTime today) 
{ 
//chosen solution method body
}

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

另一个函数,不是我的,而是在网上找到的,有点精致:


public static int GetAge(DateTime birthDate)
{
 DateTime n = DateTime.Now;//To avoid a race condition around midnight
 int age = n.Year - birthDate.Year;

 if (n.Month <birthDate.Month || (n.Month == birthDate.Month && n.Day <birthDate.Day))
 age--;

 return age;
}

我想到了两种事情: 不使用公历的国家或者地区的人怎么办? DateTime.Now 在server-specific文化中我认为。 我绝对有 0个关于亚洲日历的知识,我不知道是否有一个简单的方法来转换日历之间的日期,但如果你想让那些中国的人知道年 4660: - )

这是我们在这里使用的版本。 它工作起来很简单。 杰夫的它像是,但我认为它是一个小更清晰,因为它用于分隔逻辑剪切剪切一个金币,因此它更加容易的进行理解。


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

如果你认为这类事情不清楚,你可以展开三元运算符使它的更加清晰。

显然,这是作为 DateTime的一个扩展方法完成的,但是你可以很清楚地抓住一行代码,并把它放在任何地方。 这里我们还有一个通过 DateTime.Now 传递的扩展方法的重载,只是为了完整。

...