# 我如何用C＃计算某人的年龄？

0
@Yaur：只需将现在+出生时间转换为GMT / UTC，年龄只是一个相对值，因此时区是无关紧要的。要确定用户当前的时区，可以使用GeoLocating。

## 7 答案

（不可否认，这对于在Stack Overflow中显示用户配置文件有点噱头，但是读者也许会发现它的一些用处:-)）

``````double AgeDiff(DateTime date1, DateTime date2) {
double years = date2.Year - date1.Year;

/*
* If date2 and date1 + round(date2 - date1) are on different sides
* of 29 February, then our partial year is considered to have 366
* days total, otherwise it's 365. Note that 59 is the day number
* of 29 Feb.
*/
double fraction = 365
+ (DateTime.IsLeapYear(date2.Year) && date2.DayOfYear >= 59
&& (date1.DayOfYear < 59 || date1.DayOfYear > date2.DayOfYear)
? 1 : 0);

/*
* The only really nontrivial case is if date1 is in a leap year,
* and date2 is not. So let's handle the others first.
*/
if (DateTime.IsLeapYear(date2.Year) == DateTime.IsLeapYear(date1.Year))
return years + (date2.DayOfYear - date1.DayOfYear) / fraction;

/*
* If date2 is in a leap year, but date1 is not and is March or
* beyond, shift up by a day.
*/
if (DateTime.IsLeapYear(date2.Year)) {
return years + (date2.DayOfYear - date1.DayOfYear
- (date1.DayOfYear >= 59 ? 1 : 0)) / fraction;
}

/*
* If date1 is not on 29 February, shift down date1 by a day if
* March or later. Proceed normally.
*/
if (date1.DayOfYear != 59) {
return years + (date2.DayOfYear - date1.DayOfYear
+ (date1.DayOfYear > 59 ? 1 : 0)) / fraction;
}

/*
* Okay, here date1 is on 29 February, and date2 is not on a leap
* year. What to do now? On 28 Feb in date2's year, the ``age''
* should be just shy of a whole number, and on 1 Mar should be
* just over. Perhaps the easiest way is to a point halfway
* between those two: 58.5.
*/
return years + (date2.DayOfYear - 58.5) / fraction;
}
``````
0

``````DateTime birthDate = new DateTime(2000,3,1);
int age = (int)Math.Floor((DateTime.Now - birthDate).TotalDays / 365.25D);
``````

0

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

0

0

@some - 韩国人仍然主要使用这个系统。

``````20080814 - 19800703 = 280111
``````

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

DateTime.MaxValue年是9999，MinValue年是1，溢出是不可能的。

@numerek请将您的建议修改作为自己的答案。对于什么是值得的，当前的10000次是远不及整数溢出的两个数量级。 20,150,000比2,147,483,648

Horray用于 `yyyymmdd` 。我在一台 P>个人计算机（大约1981年）上使用的第一个数据库产品以这种格式存储日期。任何类型的日期操作都非常容易。

``````// Save today's date.
var today = DateTime.Today;
// Calculate the age.
var age = today.Year - birthdate.Year;
// Go back to the year the person was born in case of a leap year
``````

0

@JAG：DateTime.Today应该更快。

@Danvil，它真的错了吗？举一个更简单的例子。生日= 2000/02/29，今天= 2001/02/28。过去的日子：365.那不是一年，因此，28日不是一岁的人吗？或者是一年365-1 / 4天的定义？我只是在说，这很复杂。

@Legends它的回答中提出了比假设更多的假设，对于你的情况，只有这些假设适合你的情况才是正确的。如果不知道你的情况，除了你自己以外，任何人都不可能将其转化为是或否的答案。

@ LukeTO'Brien ```if（bday> today.AddYears（-age））age - ;``` 在这个答案中的一部分应该照顾到这一点。根据年份数的差异， `age` 将在 `10` 处。如果生日（1990年12月）晚于10年前（即1990年3月），那么 `age` 会减少到 `9` 。你是说这对你不起作用吗？

@LarsD“当前活着的人出生后，有几个国家已经跳过日期”< - 你是什么意思？

@Rob我想你是对的，但这是一个精确的问题，通常你的生日会在特定的一天的00:00 - 23:59:59之间。

@cja - 这意味着一些国家在几年前就开始使用一些流氓软件来同步日历并消除差异！ en.wikipedia.org/wiki/Gregorian_calendar 可能会讲更多关于它，我还没有完全读。提到'现在的人'只是简单地说，调整发生在20世纪（1901年至2000年）。从那个时期开始，很多人还活着！ :)

@NKCSS：这不能正确处理闰年。我的测试表明只有 ```if（bday> now.AddYears（-age））```有效。由于 `DayOfYear` 在2012年返回 `61` ，2011年3月1日返回 `60`

@LarsD所以你说的是没有办法计算人的年龄？垃圾。他们与日历搞砸了，他们可以适应。即使你可以做一个图书馆来计算基于区域的交叉日历，a）你从哪里获得这个信息？b）它实际上值得吗？

@ TristanWarner-Smith从技术上来说，它确实如此。如果你是在1990年1月1日下午1点出生的，那么你在1991年1月1日12:59时是0，但是在1991年1月1日下午1:01时是1。

DateTime birthdate = new DateTime（2012，11，5）; DateTime now = DateTime.Now; int年=现在。年 - birthdate.Year; if（now.Month

```int age = DateTime.Today.Year - bday.Year; age = bday> DateTime.Today.AddYears（-age））？年龄 - ：年龄;```

@Rob在美国，至少，可以接受的是，在你的生日当天，无论你出生的那一天是什么时候，你都会被认为是年后的下一个年龄段。即使有人出生于1月1日晚上11:59，在新年派对上球落下时，即使你的出生时间还差不多24小时，每个人都会接受你的年龄有所改变。 :)从法律上讲，一个人在他们的生日也被认为是年纪大一岁。无论是开车16次，喝酒21次，还是18次投票。不管你出生在什么时候。在你的生日那天，你比你大一岁。

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

0