-3

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

DateTime.Subtract()给出差异,TimeSpan最大面额为天。

所以,如果我想准确地得到今天和 1988 年的某一天(比如 1988 年 3 月 29 日)之间的差异,是否有一种“更简单”的方法可以得到这个人的准确年龄?

我试过的是:

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

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

4

2 回答 2

13

我有偏见,但我会使用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值,然后在它做错事时进行调整,但这有点棘手。

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

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

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

于 2013-01-23T09:58:43.757 回答
1

Here's how you can get the age in years:

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

This accounts for leap years, and will increment the age exactly on their birthday.

于 2013-01-23T10:06:43.500 回答