如何在“年”中准确区分两个DateTime对象

如何准确地在“年”中获得两个DateTime对象之间的差异(以年为单位)?

DateTime.Subtract()给出了TimeSpan差异,最大面额是Days。

那么,如果我想要准确地说,今天和1988年的一天(比如说1988年3月29日)之间的差异,是否有一种“更容易”的方式来获得这个人的准确年龄?

我试过的是:

 DateTime March291988 = DateTime.Parse("29/03/1988"); TimeSpan ts = DateTime.Now.Subtract(March291988); int years = (ts.Days/365); 

更重要的是,问题是:如何从TimeSpan转换为DateTime。

我有偏见,但我会使用Noda Time :

 var date1 = new LocalDate(1988, 3, 29); var date2 = new LocalDate(2013, 1, 23); // See note below var years = Period.Between(date1, date2, PeriodUnits.Years).Years; 

基本上BCL没有提供一个非常简单的方法来处理这样的事情 – 你真的想要TimeSpan ,因为它没有锚定到特定的开始/结束点。 你可以从另一个中减去Year值,然后调整它是否做错了,但它有点icky。

现在在原始代码中,您使用了DateTime.Now 。 在Noda Time中,我们将时钟视为依赖, SystemClock.Instance是正常的生产实现。 IClock不知道时区 – 它只知道当前时刻 – 所以你必须说出你感兴趣的时区。例如:

 var today = clock.Now.InZone(zone).LocalDateTime.Date; 

我知道这看起来很啰嗦,但它正在隔离所有不同的转换,使其更加明确。 (我可能会在ZoneDateTime上引入一个Date属性来稍微减少它。)

以下是您如何获得多年的年龄:

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

这说明了闰年,并将在他们的生日正好增加年龄。