如何根据DateTime类型的生日计算某人的年龄?

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

770920 次浏览

我所知道的最好的方法,因为闰年和一切是:

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

另一个功能,不是我的,而是在网上找到的,并对其进行了一些改进:

public static int GetAge(DateTime birthDate){DateTime n = DateTime.Now; // To avoid a race condition around midnightint age = n.Year - birthDate.Year;
if (n.Month < birthDate.Month || (n.Month == birthDate.Month && n.Day < birthDate.Day))age--;
return age;}

只有两件事进入我的脑海:来自不使用公历的国家的人呢?DateTime. Now我认为是在特定于服务器的文化中。我对实际使用亚洲日历的知识完全为零,我不知道是否有一种简单的方法来转换日历之间的日期,但以防万一你想知道4660年的那些中国人:-)

一个简单易懂的解决方案。

// Save today's date.var today = DateTime.Today;
// Calculate the age.var age = today.Year - birthdate.Year;
// Go back to the year in which the person was born in case of a leap yearif (birthdate.Date > today.AddYears(-age)) age--;

但是,这假设您正在寻找年龄的西方概念而不是使用东亚清算

这是我们在这里使用的版本。它有效,而且相当简单。它和杰夫的想法一样,但我认为它更清晰,因为它分离了减去1的逻辑,所以它更容易理解。

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

您可以扩展三元运算符以使其更清晰,如果您认为这种事情不清楚。

显然,这是作为DateTime上的扩展方法完成的,但显然您可以获取执行此工作的一行代码并将其放在任何地方。这里我们有另一个传入DateTime.Now的扩展方法重载,只是为了完整性。

这是一种奇怪的方法,但是如果您将日期格式化为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;}

我创建了一个SQL服务器用户定义函数来计算某人的年龄,给定他们的生日。当你需要它作为查询的一部分时,这很有用:

using System;using System.Data;using System.Data.Sql;using System.Data.SqlClient;using System.Data.SqlTypes;using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions{[SqlFunction(DataAccess = DataAccessKind.Read)]public static SqlInt32 CalculateAge(string strBirthDate){DateTime dtBirthDate = new DateTime();dtBirthDate = Convert.ToDateTime(strBirthDate);DateTime dtToday = DateTime.Now;
// get the difference in yearsint years = dtToday.Year - dtBirthDate.Year;
// subtract another year if we're before the// birth day in the current yearif (dtToday.Month < dtBirthDate.Month || (dtToday.Month == dtBirthDate.Month && dtToday.Day < dtBirthDate.Day))years=years-1;
int intCustomerAge = years;return intCustomerAge;}};

我认为TimeSpan包含了我们需要的所有内容,而不必求助于365.25(或任何其他近似值)。

DateTime myBD = new DateTime(1980, 10, 10);TimeSpan difference = DateTime.Now.Subtract(myBD);
textBox1.Text = difference.Years + " years " + difference.Months + " Months " + difference.Days + " days";

我的建议

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

这似乎让年份在正确的日期上发生了变化。(我在107岁之前进行了现场测试。)

我花了一些时间研究这个,并想出了这个来计算某人的年龄,以年,月和日为单位。我已经针对2月29日问题和闰年进行了测试,它似乎有效,我很感激任何反馈:

public void LoopAge(DateTime myDOB, DateTime FutureDate){int years = 0;int months = 0;int days = 0;
DateTime tmpMyDOB = new DateTime(myDOB.Year, myDOB.Month, 1);
DateTime tmpFutureDate = new DateTime(FutureDate.Year, FutureDate.Month, 1);
while (tmpMyDOB.AddYears(years).AddMonths(months) < tmpFutureDate){months++;
if (months > 12){years++;months = months - 12;}}
if (FutureDate.Day >= myDOB.Day){days = days + FutureDate.Day - myDOB.Day;}else{months--;
if (months < 0){years--;months = months + 12;}
days +=DateTime.DaysInMonth(FutureDate.AddMonths(-1).Year, FutureDate.AddMonths(-1).Month) + FutureDate.Day - myDOB.Day;
}
//add an extra day if the dob is a leap dayif (DateTime.IsLeapYear(myDOB.Year) && myDOB.Month == 2 && myDOB.Day == 29){//but only if the future date is less than 1st Marchif (FutureDate >= new DateTime(FutureDate.Year, 3, 1))days++;}
}

这里有一个单行:

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

这里有一个解决方案。

DateTime dateOfBirth = new DateTime(2000, 4, 18);DateTime currentDate = DateTime.Now;
int ageInYears = 0;int ageInMonths = 0;int ageInDays = 0;
ageInDays = currentDate.Day - dateOfBirth.Day;ageInMonths = currentDate.Month - dateOfBirth.Month;ageInYears = currentDate.Year - dateOfBirth.Year;
if (ageInDays < 0){ageInDays += DateTime.DaysInMonth(currentDate.Year, currentDate.Month);ageInMonths = ageInMonths--;
if (ageInMonths < 0){ageInMonths += 12;ageInYears--;}}
if (ageInMonths < 0){ageInMonths += 12;ageInYears--;}
Console.WriteLine("{0}, {1}, {2}", ageInYears, ageInMonths, ageInDays);

这是一个测试片段:

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 9CalculateAgeWrong2(bDay, now),      // outputs 9CalculateAgeCorrect(bDay, now),     // outputs 8CalculateAgeCorrect2(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;}
public int CalculateAgeCorrect2(DateTime birthDate, DateTime now){int age = now.Year - birthDate.Year;
// For leap years we need thisif (birthDate > now.AddYears(-age))age--;// Don't use:// if (birthDate.AddYears(age) > now)//     age--;
return age;}

这可能会奏效:

public override bool IsValid(DateTime value){_dateOfBirth =  value;var yearsOld = (double) (DateTime.Now.Subtract(_dateOfBirth).TotalDays/365);if (yearsOld > 18)return true;return false;}

我创建了一个年龄结构,如下所示:

public struct Age : IEquatable<Age>, IComparable<Age>{private readonly int _years;private readonly int _months;private readonly int _days;
public int Years  { get { return _years; } }public int Months { get { return _months; } }public int Days { get { return _days; } }
public Age( int years, int months, int days ) : this(){_years = years;_months = months;_days = days;}
public static Age CalculateAge( DateTime dateOfBirth, DateTime date ){// Here is some logic that ressembles Mike's solution, although it// also takes into account months & days.// Ommitted for brevity.return new Age (years, months, days);}
// Ommited Equality, Comparable, GetHashCode, functionality for brevity.}

这是我为C#编写的一个小代码示例,要小心特别是闰年的边缘情况,并不是所有上述解决方案都考虑到了它们。将答案作为DateTime推送出去可能会导致问题,因为你最终可能会尝试在特定月份中放置太多天,例如2月的30天。

public string LoopAge(DateTime myDOB, DateTime FutureDate){int years = 0;int months = 0;int days = 0;
DateTime tmpMyDOB = new DateTime(myDOB.Year, myDOB.Month, 1);
DateTime tmpFutureDate = new DateTime(FutureDate.Year, FutureDate.Month, 1);
while (tmpMyDOB.AddYears(years).AddMonths(months) < tmpFutureDate){months++;if (months > 12){years++;months = months - 12;}}
if (FutureDate.Day >= myDOB.Day){days = days + FutureDate.Day - myDOB.Day;}else{months--;if (months < 0){years--;months = months + 12;}days = days + (DateTime.DaysInMonth(FutureDate.AddMonths(-1).Year, FutureDate.AddMonths(-1).Month) + FutureDate.Day) - myDOB.Day;
}
//add an extra day if the dob is a leap dayif (DateTime.IsLeapYear(myDOB.Year) && myDOB.Month == 2 && myDOB.Day == 29){//but only if the future date is less than 1st Marchif(FutureDate >= new DateTime(FutureDate.Year, 3,1))days++;}
return "Years: " + years + " Months: " + months + " Days: " + days;}

我用这个:

public static class DateTimeExtensions{public static int Age(this DateTime birthDate){return Age(birthDate, DateTime.Now);}
public static int Age(this DateTime birthDate, DateTime offsetDate){int result=0;result = offsetDate.Year - birthDate.Year;
if (offsetDate.DayOfYear < birthDate.DayOfYear){result--;}
return result;}}

保持简单(可能是愚蠢的:))。

DateTime birth = new DateTime(1975, 09, 27, 01, 00, 00, 00);TimeSpan ts = DateTime.Now - birth;Console.WriteLine("You are approximately " + ts.TotalSeconds.ToString() + " seconds old.");
private int GetAge(int _year, int _month, int _day{DateTime yourBirthDate= new DateTime(_year, _month, _day);
DateTime todaysDateTime = DateTime.Today;int noOfYears = todaysDateTime.Year - yourBirthDate.Year;
if (DateTime.Now.Month < yourBirthDate.Month ||(DateTime.Now.Month == yourBirthDate.Month && DateTime.Now.Day < yourBirthDate.Day)){noOfYears--;}
return  noOfYears;}

我发现的最简单的方法是这个。它适用于美国和西欧地区。不能和其他地区说话,尤其是像中国这样的地方。最多4个额外的比较,在最初的年龄计算之后。

public int AgeInYears(DateTime birthDate, DateTime referenceDate){Debug.Assert(referenceDate >= birthDate,"birth date must be on or prior to the reference date");
DateTime birth = birthDate.Date;DateTime reference = referenceDate.Date;int years = (reference.Year - birth.Year);
//// an offset of -1 is applied if the birth date has// not yet occurred in the current year.//if (reference.Month > birth.Month);else if (reference.Month < birth.Month)--years;else // in birth month{if (reference.Day < birth.Day)--years;}
return years ;}

我正在查看这个问题的答案,并注意到没有人提到闰日出生的监管/法律影响。例如,每个维基百科,如果你出生在不同的司法管辖区的2月29日,你的非闰年生日各不相同:

  • 在英国和香港:这是一年中的序号日,所以第二天,3月1日是你的生日。
  • 在新西兰:前一天,2月28日用于驾驶执照,3月1日用于其他目的。
  • 台湾:2月28日。

据我所知,在美国,法规对此事保持沉默,将其留给普通法以及各种监管机构如何在其法规中定义事物。

为此,改进:

public enum LeapDayRule{OrdinalDay     = 1 ,LastDayOfMonth = 2 ,}
static int ComputeAgeInYears(DateTime birth, DateTime reference, LeapYearBirthdayRule ruleInEffect){bool isLeapYearBirthday = CultureInfo.CurrentCulture.Calendar.IsLeapDay(birth.Year, birth.Month, birth.Day);DateTime cutoff;
if (isLeapYearBirthday && !DateTime.IsLeapYear(reference.Year)){switch (ruleInEffect){case LeapDayRule.OrdinalDay:cutoff = new DateTime(reference.Year, 1, 1).AddDays(birth.DayOfYear - 1);break;
case LeapDayRule.LastDayOfMonth:cutoff = new DateTime(reference.Year, birth.Month, 1).AddMonths(1).AddDays(-1);break;
default:throw new InvalidOperationException();}}else{cutoff = new DateTime(reference.Year, birth.Month, birth.Day);}
int age = (reference.Year - birth.Year) + (reference >= cutoff ? 0 : -1);return age < 0 ? 0 : age;}

应该注意的是,此代码假设:

  • 西方(欧洲)对年龄的计算
  • 一种日历,如公历,在月末插入一个闰日。

对此的简单答案是应用如下所示的AddYears,因为这是唯一的本地方法,可以将年份添加到闰年的2月29日,并获得普通年份的2月28日的正确结果。

有些人认为3月1日是出生者的生日,但两者都不支持。网络或任何官方规则都不支持这一点,也没有共同的逻辑解释为什么一些出生在2月的人应该在另一个月有75%的生日。

此外,Age方法本身可以作为DateTime的扩展添加。通过这种方式,您可以以最简单的方式获得年龄:

  1. 列表项

int 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();}}

关键日期的例子是这样的:

出生日期:2000-02-29后来日期:2011-02-28年龄:11

输出:

{Birth date: 2000-02-28  Later date: 2011-02-27  Age: 10Birth date: 2000-02-28  Later date: 2011-02-28  Age: 11Birth date: 2000-02-28  Later date: 2011-03-01  Age: 11Birth date: 2000-02-29  Later date: 2011-02-27  Age: 10Birth date: 2000-02-29  Later date: 2011-02-28  Age: 11Birth date: 2000-02-29  Later date: 2011-03-01  Age: 11Birth date: 2000-03-01  Later date: 2011-02-27  Age: 10Birth date: 2000-03-01  Later date: 2011-02-28  Age: 10Birth 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: 12Birth date: 2000-02-28  Later date: 2012-02-29  Age: 12Birth date: 2000-02-28  Later date: 2012-03-01  Age: 12Birth date: 2000-02-29  Later date: 2012-02-28  Age: 11Birth date: 2000-02-29  Later date: 2012-02-29  Age: 12Birth date: 2000-02-29  Later date: 2012-03-01  Age: 12Birth date: 2000-03-01  Later date: 2012-02-28  Age: 11Birth date: 2000-03-01  Later date: 2012-02-29  Age: 11Birth date: 2000-03-01  Later date: 2012-03-01  Age: 12}

这个解决方案怎么样?

static string CalcAge(DateTime birthDay){DateTime currentDate = DateTime.Now;int approximateAge = currentDate.Year - birthDay.Year;int daysToNextBirthDay = (birthDay.Month * 30 + birthDay.Day) -(currentDate.Month * 30 + currentDate.Day) ;
if (approximateAge == 0 || approximateAge == 1){int month =  Math.Abs(daysToNextBirthDay / 30);int days = Math.Abs(daysToNextBirthDay % 30);
if (month == 0)return "Your age is: " + daysToNextBirthDay + " days";
return "Your age is: " + month + " months and " + days + " days"; ;}
if (daysToNextBirthDay > 0)return "Your age is: " + --approximateAge + " Years";
return "Your age is: " + approximateAge + " Years"; ;}

2要解决的主要问题是:

1.计算准确年龄-年、月、日等。

2.计算一般感知年龄-人们通常不关心他们到底有多大,他们只关心他们今年的生日是什么时候。


1的解决方案是显而易见的:

DateTime birth = DateTime.Parse("1.1.2000");DateTime today = DateTime.Today;     //we usually don't care about birth timeTimeSpan age = today - birth;        //.NET FCL should guarantee this as precisedouble ageInDays = age.TotalDays;    //total number of days ... also precisedouble daysInYear = 365.2425;        //statistical value for 400 yearsdouble 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个静态重载方法,一个用于通用使用,第二个用于使用友好性:

public static int GetAge(DateTime bithDay, DateTime today){//chosen solution method body}
public static int GetAge(DateTime birthDay){return GetAge(birthDay, DateTime.Now);}

以下方法(摘自. NET的时间段库 classDateDiff测试平台)考虑文化信息的日历:

// ----------------------------------------------------------------------private static int YearDiff( DateTime date1, DateTime date2 ){return YearDiff( date1, date2, DateTimeFormatInfo.CurrentInfo.Calendar );} // YearDiff
// ----------------------------------------------------------------------private static int YearDiff( DateTime date1, DateTime date2, Calendar calendar ){if ( date1.Equals( date2 ) ){return 0;}
int year1 = calendar.GetYear( date1 );int month1 = calendar.GetMonth( date1 );int year2 = calendar.GetYear( date2 );int month2 = calendar.GetMonth( date2 );
// find the the day to compareint compareDay = date2.Day;int compareDaysPerMonth = calendar.GetDaysInMonth( year1, month1 );if ( compareDay > compareDaysPerMonth ){compareDay = compareDaysPerMonth;}
// build the compare dateDateTime compareDate = new DateTime( year1, month2, compareDay,date2.Hour, date2.Minute, date2.Second, date2.Millisecond );if ( date2 > date1 ){if ( compareDate < date1 ){compareDate = compareDate.AddYears( 1 );}}else{if ( compareDate > date1 ){compareDate = compareDate.AddYears( -1 );}}return year2 - calendar.GetYear( compareDate );} // YearDiff

用法:

// ----------------------------------------------------------------------public void CalculateAgeSamples(){PrintAge( new DateTime( 2000, 02, 29 ), new DateTime( 2009, 02, 28 ) );// > Birthdate=29.02.2000, Age at 28.02.2009 is 8 yearsPrintAge( new DateTime( 2000, 02, 29 ), new DateTime( 2012, 02, 28 ) );// > Birthdate=29.02.2000, Age at 28.02.2012 is 11 years} // CalculateAgeSamples
// ----------------------------------------------------------------------public void PrintAge( DateTime birthDate, DateTime moment ){Console.WriteLine( "Birthdate={0:d}, Age at {1:d} is {2} years", birthDate, moment, YearDiff( birthDate, moment ) );} // PrintAge

这是一个DateTime扩展器,它将年龄计算添加到DateTime对象。

public static class AgeExtender{public static int GetAge(this DateTime dt){int d = int.Parse(dt.ToString("yyyyMMdd"));int t = int.Parse(DateTime.Today.ToString("yyyyMMdd"));return (t-d)/10000;}}

我对马克·索恩的答案做了一个小改动:我重写了第三行,以便更容易解析表达式。

public int AgeInYears(DateTime bday){DateTime now = DateTime.Today;int age = now.Year - bday.Year;if (bday.AddYears(age) > now)age--;return age;}

为了清晰起见,我也把它变成了一个函数。

我使用ScArcher2的解决方案来准确计算一个人的年龄,但我需要进一步计算他们的月份和天数以及年份。

    public static Dictionary<string,int> CurrentAgeInYearsMonthsDays(DateTime? ndtBirthDate, DateTime? ndtReferralDate){//----------------------------------------------------------------------// Can't determine age if we don't have a dates.//----------------------------------------------------------------------if (ndtBirthDate == null) return null;if (ndtReferralDate == null) return null;
DateTime dtBirthDate = Convert.ToDateTime(ndtBirthDate);DateTime dtReferralDate = Convert.ToDateTime(ndtReferralDate);
//----------------------------------------------------------------------// Create our Variables//----------------------------------------------------------------------Dictionary<string, int> dYMD = new Dictionary<string,int>();int iNowDate, iBirthDate, iYears, iMonths, iDays;string sDif = "";
//----------------------------------------------------------------------// Store off current date/time and DOB into local variables//----------------------------------------------------------------------iNowDate = int.Parse(dtReferralDate.ToString("yyyyMMdd"));iBirthDate = int.Parse(dtBirthDate.ToString("yyyyMMdd"));
//----------------------------------------------------------------------// Calculate Years//----------------------------------------------------------------------sDif = (iNowDate - iBirthDate).ToString();iYears = int.Parse(sDif.Substring(0, sDif.Length - 4));
//----------------------------------------------------------------------// Store Years in Return Value//----------------------------------------------------------------------dYMD.Add("Years", iYears);
//----------------------------------------------------------------------// Calculate Months//----------------------------------------------------------------------if (dtBirthDate.Month > dtReferralDate.Month)iMonths = 12 - dtBirthDate.Month + dtReferralDate.Month - 1;elseiMonths = dtBirthDate.Month - dtReferralDate.Month;
//----------------------------------------------------------------------// Store Months in Return Value//----------------------------------------------------------------------dYMD.Add("Months", iMonths);
//----------------------------------------------------------------------// Calculate Remaining Days//----------------------------------------------------------------------if (dtBirthDate.Day > dtReferralDate.Day)//Logic: Figure out the days in month previous to the current month, or the admitted month.//       Subtract the birthday from the total days which will give us how many days the person has lived since their birthdate day the previous month.//       then take the referral date and simply add the number of days the person has lived this month.
//If referral date is january, we need to go back to the following year's December to get the days in that month.if (dtReferralDate.Month == 1)iDays = DateTime.DaysInMonth(dtReferralDate.Year - 1, 12) - dtBirthDate.Day + dtReferralDate.Day;elseiDays = DateTime.DaysInMonth(dtReferralDate.Year, dtReferralDate.Month - 1) - dtBirthDate.Day + dtReferralDate.Day;elseiDays = dtReferralDate.Day - dtBirthDate.Day;
//----------------------------------------------------------------------// Store Days in Return Value//----------------------------------------------------------------------dYMD.Add("Days", iDays);
return dYMD;}

我想添加希伯来语日历计算(或其他System. Globalization日历可以以相同的方式使用),使用此线程中的重新编写的函数:

Public Shared Function CalculateAge(BirthDate As DateTime) As IntegerDim HebCal As New System.Globalization.HebrewCalendar ()Dim now = DateTime.Now()Dim iAge = HebCal.GetYear(now) - HebCal.GetYear(BirthDate)Dim iNowMonth = HebCal.GetMonth(now), iBirthMonth = HebCal.GetMonth(BirthDate)If iNowMonth < iBirthMonth Or (iNowMonth = iBirthMonth AndAlso HebCal.GetDayOfMonth(now) < HebCal.GetDayOfMonth(BirthDate)) Then iAge -= 1Return iAgeEnd Function

这很简单,似乎对我的需求是准确的。我在为闰年的目的做一个假设,无论这个人选择什么时候庆祝生日,他们在技术上都不会老一岁,直到他们上一个生日已经过去了365天(即2月28日不会让他们老一岁)。

DateTime now = DateTime.Today;DateTime birthday = new DateTime(1991, 02, 03);//3rd feb
int age = now.Year - birthday.Year;
if (now.Month < birthday.Month || (now.Month == birthday.Month && now.Day < birthday.Day))//not had bday this year yetage--;
return age;

试试这个解决方案,它起作用了。

int age = (Int32.Parse(DateTime.Today.ToString("yyyyMMdd")) -Int32.Parse(birthday.ToString("yyyyMMdd rawrrr"))) / 10000;

这不是一个直接的答案,而是从准科学的角度对手头的问题进行哲学推理。

我认为这个问题并没有具体说明测量年龄的单位或文化,大多数答案似乎都假设了整数年表示。时间的SI-单位是second,因此正确的通用答案应该是(当然假设标准化DateTime并且不考虑相对论效应):

var lifeInSeconds = (DateTime.Now.Ticks - then.Ticks)/TickFactor;

以基督教的方式计算年龄:

var then = ... // Then, in this case the birthdayvar now = DateTime.UtcNow;int age = now.Year - then.Year;if (now.AddYears(-age) < then) age--;

在金融领域,在计算通常被称为日计数分数的东西时也有类似的问题,这大致是一个给定时期的年数。年龄问题实际上是一个时间测量问题。

实际/实际(“正确”计算所有天数)约定的示例:

DateTime start, end = .... // Whatever, assume start is before end
double startYearContribution = 1 - (double) start.DayOfYear / (double) (DateTime.IsLeapYear(start.Year) ? 366 : 365);double endYearContribution = (double)end.DayOfYear / (double)(DateTime.IsLeapYear(end.Year) ? 366 : 365);double middleContribution = (double) (end.Year - start.Year - 1);
double DCF = startYearContribution + endYearContribution + middleContribution;

另一种非常常见的测量时间的方法是“序列化”(命名这个日期约定的家伙一定是被绊倒了):

DateTime start, end = .... // Whatever, assume start is before endint days = (end - start).Days;

我想知道,在相对论时代(以秒为单位)变得比迄今为止地球绕太阳周期的粗略近似更有用之前,我们还需要多长时间:)或者换句话说,当一个周期必须被赋予一个位置或一个代表运动的函数才能有效时:)

我们需要考虑小于1岁的人吗?根据中国文化,我们将小婴儿的年龄描述为2个月或4周。

下面是我的实现,它并不像我想象的那么简单,特别是处理像2/28这样的日期。

public static string HowOld(DateTime birthday, DateTime now){if (now < birthday)throw new ArgumentOutOfRangeException("birthday must be less than now.");
TimeSpan diff = now - birthday;int diffDays = (int)diff.TotalDays;
if (diffDays > 7)//year, month and week{int age = now.Year - birthday.Year;
if (birthday > now.AddYears(-age))age--;
if (age > 0){return age + (age > 1 ? " years" : " year");}else{// month and weekDateTime d = birthday;int diffMonth = 1;
while (d.AddMonths(diffMonth) <= now){diffMonth++;}
age = diffMonth-1;
if (age == 1 && d.Day > now.Day)age--;
if (age > 0){return age + (age > 1 ? " months" : " month");}else{age = diffDays / 7;return age + (age > 1 ? " weeks" : " week");}}}else if (diffDays > 0){int age = diffDays;return age + (age > 1 ? " days" : " day");}else{int age = diffDays;return "just born";}}

此实现已通过以下测试用例。

[TestMethod]public void TestAge(){string age = HowOld(new DateTime(2011, 1, 1), new DateTime(2012, 11, 30));Assert.AreEqual("1 year", age);
age = HowOld(new DateTime(2011, 11, 30), new DateTime(2012, 11, 30));Assert.AreEqual("1 year", age);
age = HowOld(new DateTime(2001, 1, 1), new DateTime(2012, 11, 30));Assert.AreEqual("11 years", age);
age = HowOld(new DateTime(2012, 1, 1), new DateTime(2012, 11, 30));Assert.AreEqual("10 months", age);
age = HowOld(new DateTime(2011, 12, 1), new DateTime(2012, 11, 30));Assert.AreEqual("11 months", age);
age = HowOld(new DateTime(2012, 10, 1), new DateTime(2012, 11, 30));Assert.AreEqual("1 month", age);
age = HowOld(new DateTime(2008, 2, 28), new DateTime(2009, 2, 28));Assert.AreEqual("1 year", age);
age = HowOld(new DateTime(2008, 3, 28), new DateTime(2009, 2, 28));Assert.AreEqual("11 months", age);
age = HowOld(new DateTime(2008, 3, 28), new DateTime(2009, 3, 28));Assert.AreEqual("1 year", age);
age = HowOld(new DateTime(2009, 1, 28), new DateTime(2009, 2, 28));Assert.AreEqual("1 month", age);
age = HowOld(new DateTime(2009, 2, 1), new DateTime(2009, 3, 1));Assert.AreEqual("1 month", age);
// NOTE.// new DateTime(2008, 1, 31).AddMonths(1) == new DateTime(2009, 2, 28);// new DateTime(2008, 1, 28).AddMonths(1) == new DateTime(2009, 2, 28);age = HowOld(new DateTime(2009, 1, 31), new DateTime(2009, 2, 28));Assert.AreEqual("4 weeks", age);
age = HowOld(new DateTime(2009, 2, 1), new DateTime(2009, 2, 28));Assert.AreEqual("3 weeks", age);
age = HowOld(new DateTime(2009, 2, 1), new DateTime(2009, 3, 1));Assert.AreEqual("1 month", age);
age = HowOld(new DateTime(2012, 11, 5), new DateTime(2012, 11, 30));Assert.AreEqual("3 weeks", age);
age = HowOld(new DateTime(2012, 11, 1), new DateTime(2012, 11, 30));Assert.AreEqual("4 weeks", age);
age = HowOld(new DateTime(2012, 11, 20), new DateTime(2012, 11, 30));Assert.AreEqual("1 week", age);
age = HowOld(new DateTime(2012, 11, 25), new DateTime(2012, 11, 30));Assert.AreEqual("5 days", age);
age = HowOld(new DateTime(2012, 11, 29), new DateTime(2012, 11, 30));Assert.AreEqual("1 day", age);
age = HowOld(new DateTime(2012, 11, 30), new DateTime(2012, 11, 30));Assert.AreEqual("just born", age);
age = HowOld(new DateTime(2000, 2, 29), new DateTime(2009, 2, 28));Assert.AreEqual("8 years", age);
age = HowOld(new DateTime(2000, 2, 29), new DateTime(2009, 3, 1));Assert.AreEqual("9 years", age);
Exception e = null;
try{age = HowOld(new DateTime(2012, 12, 1), new DateTime(2012, 11, 30));}catch (ArgumentOutOfRangeException ex){e = ex;}
Assert.IsTrue(e != null);}

希望对你有帮助。

这是一个非常简单易懂的例子。

private int CalculateAge(){//get birthdateDateTime dtBirth = Convert.ToDateTime(BirthDatePicker.Value);int byear = dtBirth.Year;int bmonth = dtBirth.Month;int bday = dtBirth.Day;DateTime dtToday = DateTime.Now;int tYear = dtToday.Year;int tmonth = dtToday.Month;int tday = dtToday.Day;int age = tYear - byear;if (bmonth < tmonth)age--;else if (bmonth == tmonth && bday>tday){age--;}return age;}

以下是另一个答案:

public static int AgeInYears(DateTime birthday, DateTime today){return ((today.Year - birthday.Year) * 372 + (today.Month - birthday.Month) * 31 + (today.Day - birthday.Day)) / 372;}

这已经过大量的单元测试。它看起来确实有点“神奇”。数字372是一年中的天数,如果每个月有31天。

它为什么有效(从这里抬起)的解释是:

让我们设置Yn = DateTime.Now.Year, Yb = birthday.Year, Mn = DateTime.Now.Month, Mb = birthday.Month, Dn = DateTime.Now.Day, Db = birthday.Day

age = Yn - Yb + (31*(Mn - Mb) + (Dn - Db)) / 372

我们知道,如果日期已经到达,我们需要的是Yn-Yb,如果没有到达,则需要Yn-Yb-1

如果Mn<Mb,我们有-341 <= 31*(Mn-Mb) <= -31 and -30 <= Dn-Db <= 30

-371 <= 31*(Mn - Mb) + (Dn - Db) <= -1

整数除法

(31*(Mn - Mb) + (Dn - Db)) / 372 = -1

如果Mn=MbDn<Db,我们有31*(Mn - Mb) = 0 and -30 <= Dn-Db <= -1

再用整数除法

(31*(Mn - Mb) + (Dn - Db)) / 372 = -1

如果Mn>Mb,我们有31 <= 31*(Mn-Mb) <= 341 and -30 <= Dn-Db <= 30

1 <= 31*(Mn - Mb) + (Dn - Db) <= 371

整数除法

(31*(Mn - Mb) + (Dn - Db)) / 372 = 0

如果Mn=MbDn>Db,我们有31*(Mn - Mb) = 0 and 1 <= Dn-Db <= 30

再用整数除法

(31*(Mn - Mb) + (Dn - Db)) / 372 = 0

如果Mn=MbDn=Db,我们有31*(Mn - Mb) + Dn-Db = 0

因此(31*(Mn - Mb) + (Dn - Db)) / 372 = 0

通过更少的转换和UtcNow,此代码可以照顾在闰年2月29日出生的人:

public int GetAge(DateTime DateOfBirth){var Now = DateTime.UtcNow;return Now.Year - DateOfBirth.Year -((Now.Month > DateOfBirth.Month ||(Now.Month == DateOfBirth.Month && Now.Day >= DateOfBirth.Day)) ? 0 : 1);}

为什么MSDN帮助没有告诉你?这看起来很明显:

System.DateTime birthTime = AskTheUser(myUser); // :-)System.DateTime now = System.DateTime.Now;System.TimeSpan age = now - birthTime; // As simple as thatdouble ageInDays = age.TotalDays; // Will you convert to whatever you want yourself?
TimeSpan diff = DateTime.Now - birthdayDateTime;string age = String.Format("{0:%y} years, {0:%M} months, {0:%d}, days old", diff);

我不确定你希望它如何返回给你,所以我只是做了一个可读的字符串。

这为这个问题提供了“更多细节”。也许这就是你要找的

DateTime birth = new DateTime(1974, 8, 29);DateTime today = DateTime.Now;TimeSpan span = today - birth;DateTime age = DateTime.MinValue + span;
// Make adjustment due to MinValue equalling 1/1/1int years = age.Year - 1;int months = age.Month - 1;int days = age.Day - 1;
// Print out not only how many years old they are but give months and days as wellConsole.Write("{0} years, {1} months, {2} days", years, months, days);

要计算最接近年龄的年龄:

var ts = DateTime.Now - new DateTime(1988, 3, 19);var age = Math.Round(ts.Days / 365.0);

这个经典的问题值得一个野田时间的解决方案。

static int GetAge(LocalDate dateOfBirth){Instant now = SystemClock.Instance.Now;
// The target time zone is important.// It should align with the *current physical location* of the person// you are talking about.  When the whereabouts of that person are unknown,// then you use the time zone of the person who is *asking* for the age.// The time zone of birth is irrelevant!
DateTimeZone zone = DateTimeZoneProviders.Tzdb["America/New_York"];
LocalDate today = now.InZone(zone).Date;
Period period = Period.Between(dateOfBirth, today, PeriodUnits.Years);
return (int) period.Years;}

用法:

LocalDate dateOfBirth = new LocalDate(1976, 8, 27);int age = GetAge(dateOfBirth);

您可能还对以下改进感兴趣:

  • 将时钟作为IClock传递,而不是使用SystemClock.Instance,将提高可测试性。

  • 目标时区可能会发生变化,因此您也需要DateTimeZone参数。

另请参阅我关于此主题的博客文章:处理生日和其他周年纪念日

我有一个自定义的方法来计算年龄,加上一个奖励验证消息,以防万一有帮助:

public void GetAge(DateTime dob, DateTime now, out int years, out int months, out int days){years = 0;months = 0;days = 0;
DateTime tmpdob = new DateTime(dob.Year, dob.Month, 1);DateTime tmpnow = new DateTime(now.Year, now.Month, 1);
while (tmpdob.AddYears(years).AddMonths(months) < tmpnow){months++;if (months > 12){years++;months = months - 12;}}
if (now.Day >= dob.Day)days = days + now.Day - dob.Day;else{months--;if (months < 0){years--;months = months + 12;}days += DateTime.DaysInMonth(now.AddMonths(-1).Year, now.AddMonths(-1).Month) + now.Day - dob.Day;}
if (DateTime.IsLeapYear(dob.Year) && dob.Month == 2 && dob.Day == 29 && now >= new DateTime(now.Year, 3, 1))days++;
}
private string ValidateDate(DateTime dob) //This method will validate the date{int Years = 0; int Months = 0; int Days = 0;
GetAge(dob, DateTime.Now, out Years, out Months, out Days);
if (Years < 18)message =  Years + " is too young. Please try again on your 18th birthday.";else if (Years >= 65)message = Years + " is too old. Date of Birth must not be 65 or older.";elsereturn null; //Denotes validation passed}

方法在此处调用并传递datetime值(如果服务器设置为USA语言环境,则为MM/dd/yyyy)。将其替换为要显示的任何消息框或任何容器:

DateTime dob = DateTime.Parse("03/10/1982");
string message = ValidateDate(dob);
lbldatemessage.Visible = !StringIsNullOrWhitespace(message);lbldatemessage.Text = message ?? ""; //Ternary if message is null then default to empty string

请记住,您可以以任何您喜欢的方式格式化消息。

一句话的回答:

DateTime dateOfBirth = Convert.ToDateTime("01/16/1990");var age = ((DateTime.Now - dateOfBirth).Days) / 365;

与2月28日的任何一年相比,这是能够解决2月29日生日的最准确答案之一。

public int GetAge(DateTime birthDate){int age = DateTime.Now.Year - birthDate.Year;
if (birthDate.DayOfYear > DateTime.Now.DayOfYear)age--;
return age;}



只是因为我不认为最重要的答案是明确的:

public static int GetAgeByLoop(DateTime birthday){var age = -1;
for (var date = birthday; date < DateTime.Today; date = date.AddYears(1)){age++;}
return age;}

看看这个:

TimeSpan ts = DateTime.Now.Subtract(Birthdate);age = (byte)(ts.TotalDays / 365.25);

这是一个对我很有用的函数。没有计算,非常简单。

    public static string ToAge(this DateTime dob, DateTime? toDate = null){if (!toDate.HasValue)toDate = DateTime.Now;var now = toDate.Value;
if (now.CompareTo(dob) < 0)return "Future date";
int years = now.Year - dob.Year;int months = now.Month - dob.Month;int days = now.Day - dob.Day;
if (days < 0){months--;days = DateTime.DaysInMonth(dob.Year, dob.Month) - dob.Day + now.Day;}
if (months < 0){years--;months = 12 + months;}

return string.Format("{0} year(s), {1} month(s), {2} days(s)",years,months,days);}

下面是一个单元测试:

    [Test]public void ToAgeTests(){var date = new DateTime(2000, 1, 1);Assert.AreEqual("0 year(s), 0 month(s), 1 days(s)", new DateTime(1999, 12, 31).ToAge(date));Assert.AreEqual("0 year(s), 0 month(s), 0 days(s)", new DateTime(2000, 1, 1).ToAge(date));Assert.AreEqual("1 year(s), 0 month(s), 0 days(s)", new DateTime(1999, 1, 1).ToAge(date));Assert.AreEqual("0 year(s), 11 month(s), 0 days(s)", new DateTime(1999, 2, 1).ToAge(date));Assert.AreEqual("0 year(s), 10 month(s), 25 days(s)", new DateTime(1999, 2, 4).ToAge(date));Assert.AreEqual("0 year(s), 10 month(s), 1 days(s)", new DateTime(1999, 2, 28).ToAge(date));
date = new DateTime(2000, 2, 15);Assert.AreEqual("0 year(s), 0 month(s), 28 days(s)", new DateTime(2000, 1, 18).ToAge(date));}

可以这么简单:

int age = DateTime.Now.AddTicks(0 - dob.Ticks).Year - 1;

我会简单地这样做:

DateTime birthDay = new DateTime(1990, 05, 23);DateTime age = DateTime.Now - birthDay;

通过这种方式,您可以计算出一个人的确切年龄,如果需要,可以精确到毫秒。

我在这个问题上使用了以下内容。我知道它不是很优雅,但它是有效的。

DateTime zeroTime = new DateTime(1, 1, 1);var date1 = new DateTime(1983, 03, 04);var date2 = DateTime.Now;var dif = date2 - date1;int years = (zeroTime + dif).Year - 1;Log.DebugFormat("Years -->{0}", years);
public string GetAge(this DateTime birthdate, string ageStrinFormat = null){var date = DateTime.Now.AddMonths(-birthdate.Month).AddDays(-birthdate.Day);return string.Format(ageStrinFormat ?? "{0}/{1}/{2}",(date.Year - birthdate.Year), date.Month, date.Day);}

这是在一行中回答这个问题的最简单方法。

DateTime Dob = DateTime.Parse("1985-04-24"); 
int Age = DateTime.MinValue.AddDays(DateTime.Now.Subtract(Dob).TotalHours/24 - 1).Year - 1;

这也适用于闰年。

===常用语(从几个月到几岁)===

如果您只是为了常用,以下是代码作为您的信息:

DateTime today = DateTime.Today;DateTime bday = DateTime.Parse("2016-2-14");int age = today.Year - bday.Year;var unit = "";
if (bday > today.AddYears(-age)){age--;}if (age == 0)   // Under one year old{age = today.Month - bday.Month;
age = age <= 0 ? (12 + age) : age;  // The next year before birthday
age = today.Day - bday.Day >= 0 ? age : --age;  // Before the birthday.day
unit = "month";}else {unit = "year";}
if (age > 1){unit = unit + "s";}

测试结果如下:

The birthday: 2016-2-14
2016-2-15 =>  age=0, unit=month;2016-5-13 =>  age=2, unit=months;2016-5-14 =>  age=3, unit=months;2016-6-13 =>  age=3, unit=months;2016-6-15 =>  age=4, unit=months;2017-1-13 =>  age=10, unit=months;2017-1-14 =>  age=11, unit=months;2017-2-13 =>  age=11, unit=months;2017-2-14 =>  age=1, unit=year;2017-2-15 =>  age=1, unit=year;2017-3-13 =>  age=1, unit=year;2018-1-13 =>  age=1, unit=year;2018-1-14 =>  age=1, unit=year;2018-2-13 =>  age=1, unit=year;2018-2-14 =>  age=2, unit=years;

SQL版本:

declare @dd smalldatetime = '1980-04-01'declare @age int = YEAR(GETDATE())-YEAR(@dd)if (@dd> DATEADD(YYYY, -@age, GETDATE())) set @age = @age -1
print @age

哇,我必须在这里给出我的答案……这么简单的问题有这么多答案。

private int CalcularIdade(DateTime dtNascimento){var nHoje = Convert.ToInt32(DateTime.Today.ToString("yyyyMMdd"));var nAniversario = Convert.ToInt32(dtNascimento.ToString("yyyyMMdd"));
double diff = (nHoje - nAniversario) / 10000;
var ret = Convert.ToInt32(Math.Truncate(diff));
return ret;}
private int GetYearDiff(DateTime start, DateTime end){int diff = end.Year - start.Year;if (end.DayOfYear < start.DayOfYear) { diff -= 1; }return diff;}[Fact]public void GetYearDiff_WhenCalls_ShouldReturnCorrectYearDiff(){//arrangevar now = DateTime.Now;//act//assertAssert.Equal(24, GetYearDiff(new DateTime(1992, 7, 9), now)); // passedAssert.Equal(24, GetYearDiff(new DateTime(1992, now.Month, now.Day), now)); // passedAssert.Equal(23, GetYearDiff(new DateTime(1992, 12, 9), now)); // passed}

我经常依靠我的手指。当事情发生变化时,我需要查看日历来确定。这就是我在代码中要做的:

int AgeNow(DateTime birthday){return AgeAt(DateTime.Now, birthday);}
int AgeAt(DateTime now, DateTime birthday){return AgeAt(now, birthday, CultureInfo.CurrentCulture.Calendar);}
int AgeAt(DateTime now, DateTime birthday, Calendar calendar){// My age has increased on the morning of my// birthday even though I was born in the evening.now = now.Date;birthday = birthday.Date;
var age = 0;if (now <= birthday) return age; // I am zero now if I am to be born tomorrow.
while (calendar.AddYears(birthday, age + 1) <= now){age++;}return age;}

LINQPad中运行它会得到:

PASSED: someone born on 28 February 1964 is age 4 on 28 February 1968PASSED: someone born on 29 February 1964 is age 3 on 28 February 1968PASSED: someone born on 31 December 2016 is age 0 on 01 January 2017

LINQPad中的代码是这里

简单代码

 var birthYear=1993;var age = DateTime.Now.AddYears(-birthYear).Year;

要计算一个人多少岁,

DateTime dateOfBirth;
int ageInYears = DateTime.Now.Year - dateOfBirth.Year;
if (dateOfBirth > today.AddYears(-ageInYears )) ageInYears --;

只需使用:

(DateTime.Now - myDate).TotalHours / 8766.0

当前日期-myDate = TimeSpan,获取总小时数并除以每年的总小时数,并准确获取年龄/月份/天…

这是计算某人年龄的最简单方法。
计算某人的年龄非常简单,方法如下!为了使代码正常工作,您需要一个名为BirthDate的DateTime对象,其中包含生日。

 C#// get the difference in yearsint years = DateTime.Now.Year - BirthDate.Year;// subtract another year if we're before the// birth day in the current yearif (DateTime.Now.Month < BirthDate.Month ||(DateTime.Now.Month == BirthDate.Month &&DateTime.Now.Day < BirthDate.Day))years--;VB.NET' get the difference in yearsDim years As Integer = DateTime.Now.Year - BirthDate.Year' subtract another year if we're before the' birth day in the current yearIf DateTime.Now.Month < BirthDate.Month Or (DateTime.Now.Month = BirthDate.Month And DateTime.Now.Day < BirthDate.Day) Thenyears = years - 1End If
var birthDate = ... // DOBvar resultDate = DateTime.Now - birthDate;

使用resultDate,您可以应用TimeSpan属性来显示它。

很简单的答案

        DateTime dob = new DateTime(1991, 3, 4);DateTime now = DateTime.Now;int dobDay = dob.Day, dobMonth = dob.Month;int add = -1;if (dobMonth < now.Month){add = 0;}else if (dobMonth == now.Month){if(dobDay <= now.Day){add = 0;}else{add = -1;}}else{add = -1;}int age = now.Year - dob.Year + add;
int Age = new DateTime((DateTime.Now - BirthDate).Ticks).Year -1;Console.WriteLine("Age {0}", Age);

我认为这个问题可以用这样一个更简单的方法来解决——

类可以像-

using System;
namespace TSA{class BirthDay{double ageDay;public BirthDay(int day, int month, int year){DateTime birthDate = new DateTime(year, month, day);ageDay = (birthDate - DateTime.Now).TotalDays; //DateTime.UtcNow}
internal int GetAgeYear(){return (int)Math.Truncate(ageDay / 365);}
internal int GetAgeMonth(){return (int)Math.Truncate((ageDay % 365) / 30);}}}

电话可以像-

BirthDay b = new BirthDay(1,12,1990);int year = b.GetAgeYear();int month = b.GetAgeMonth();

我对DateTime一无所知,但我所能做的就是:

using System;                    
public class Program{public static int getAge(int month, int day, int year) {DateTime today = DateTime.Today;int currentDay = today.Day;int currentYear = today.Year;int currentMonth = today.Month;int age = 0;if (currentMonth < month) {age -= 1;} else if (currentMonth == month) {if (currentDay < day) {age -= 1;}}currentYear -= year;age += currentYear;return age;}public static void Main(){int ageInYears = getAge(8, 10, 2007);Console.WriteLine(ageInYears);}}

有点令人困惑,但更仔细地查看代码,一切都会有意义。

var startDate = new DateTime(2015, 04, 05);//your start datevar endDate = DateTime.Now;var years = 0;while(startDate < endDate){startDate = startDate.AddYears(1);if(startDate < endDate){years++;}}

人们可以这样计算“年龄”(即“西方人”的方式):

public static int AgeInYears(this System.DateTime source, System.DateTime target)=> target.Year - source.Year is int age && age > 0 && source.AddYears(age) > target ? age - 1 : age < 0 && source.AddYears(age) < target ? age + 1 : age;

如果时间的方向是“负的”,年龄也将是负的。

可以添加一个分数,表示从目标到下一个生日累积的年龄量:

public static double AgeInTotalYears(this System.DateTime source, System.DateTime target){var sign = (source <= target ? 1 : -1);
var ageInYears = AgeInYears(source, target); // The method above.
var last = source.AddYears(ageInYears);var next = source.AddYears(ageInYears + sign);
var fractionalAge = (double)(target - last).Ticks / (double)(next - last).Ticks * sign;
return ageInYears + fractionalAge;}

分数是过去的时间(从上一个生日)与总时间(到下一个生日)的比率。

无论时间向前还是向后,这两种方法的工作方式都是相同的。

我强烈建议使用名为年龄计算器的NuGet包,因为在计算年龄时有很多事情需要考虑(闰年、时间组件等),并且只有两行代码无法削减它。该库为您提供的不仅仅是一年。它甚至在计算时考虑了时间组件,因此您可以获得包含年、月、天和时间组件的准确年龄。更高级的是提供一个选项,将闰年的2月29日视为非闰年的2月28日。

这是一个非常简单的方法:

int Age = DateTime.Today.Year - new DateTime(2000, 1, 1).Year;

无分支解决方案:

public int GetAge(DateOnly birthDate, DateOnly today){return today.Year - birthDate.Year + (((today.Month << 5) + today.Day - ((birthDate.Month << 5) + birthDate.Day)) >> 31);}

简单易读,补充方法

public static int getAge(DateTime birthDate){var today = DateTime.Today;var age = today.Year - birthDate.Year;var monthDiff = today.Month - birthDate.Month;var dayDiff = today.Day - birthDate.Day;
if (dayDiff < 0){monthDiff--;}if (monthDiff < 0){age--;}return age;}

不知道为什么没有人这样做:

        ushort age = (ushort)DateAndTime.DateDiff(DateInterval.Year, DateTime.Now.Date, birthdate);

它只需要using Microsoft.VisualBasic;和对项目中此程序集的引用(如果尚未引用)。