关于C#:如何在“年”中准确区分两个DateTime对象


How to accurately get difference between two DateTime object in “Years” [Closed, use NodaTime]

本问题已经有最佳答案,请猛点这里访问。

如何准确获得"年"中两个DateTime对象之间的差异(以年计)?

DateTime.Subtract()表示TimeSpan的不同,最大面额为天。

所以,如果我想准确地了解今天和1988年的一天之间的区别(比如说1988年3月29日),有没有一种"更容易"的方法来确定这个人的准确年龄?

我试过的是:

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

更重要的是,问题是:如何从时间跨度转换为日期时间。


我有偏见,但我会用noda时间:

1
2
3
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值,然后调整它是否做了错误的事情,但是它有点恶心。

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

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

我知道这看起来有些冗长,但它隔离了所有不同的转换,使其更加明确。(我可以在ZoneDateTime上引入一个Date属性来稍微减少这个值。)


以下是您获得年龄的方法:

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

这意味着闰年,并且会在他们生日的时候增加年龄。