如何准确获取“年”中两个 DateTime 对象之间的差异 [已关闭,使用 NodaTime] [重复]

Posted

技术标签:

【中文标题】如何准确获取“年”中两个 DateTime 对象之间的差异 [已关闭,使用 NodaTime] [重复]【英文标题】:How to accurately get difference between two DateTime object in "Years" [Closed, use NodaTime] [duplicate] 【发布时间】:2013-01-06 18:16:15 【问题描述】:

如何准确获取“年”中两个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。

【问题讨论】:

预期结果是什么? 您发布的内容是否有效? 我想要 DateTime.Now.Subtract() 在 DateTime 而不是 TimeSpan(或从 TimeSpan 转换为 DateTime)@Jon @Aniket:这不能回答我的问题。此外,“X 年”不是 DateTime,只有将结果作为 TimeSpan 才有意义。 ***.com/questions/9/how-do-i-calculate-someones-age 【参考方案1】:

我有偏见,但我会使用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 是正常的生产实现。 IClock 不知道时区——它只知道当前时刻——所以你必须说出你感兴趣的时区。例如:

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

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

【讨论】:

NodaTime 很酷。。谢谢。 是的,我不想以任何可能的方式使用 TimeSpan。 有没有办法将 TimeSpan 转换为 DateTime?或将 DateTime 转换为 LocalDate()? @Aniket:你不能从TimeSpan 转换为DateTime,不。但是您可以使用LocalDateTime.FromDateTime,然后使用Date 属性来获取LocalDate 啊酷,还有一个问题,我在哪里可以获得更多关于 C#(5.0) 及其库(标准库)的文档(可能是 PDF,所以我可以打印)..还要感谢 NodaTime 的链接。我将在我当前的项目中使用它。【参考方案2】:

以下是获取年龄的方法:

static int AgeInYears(DateTime birthday, DateTime today)

    return ((today.Year - birthday.Year) * 372 + (today.Month - birthday.Month) * 31 + (today.Day - birthday.Day)) / 372;

这考虑了闰年,并且会在他们的生日准确地增加年龄。

【讨论】:

这不是我想要的。我也可以想到这样的算法,但我想将 TimeSpan 转换为 DateTime 啊抱歉,我以为你想要整整几年的差异。 这就是我提到“准确”的原因:-P .. +1 虽然......很好的答案。 是的,我认为“准确”是指“给出所有日期的正确年数”。一些算法在基准周年纪念日前后给出了错误的年数。

以上是关于如何准确获取“年”中两个 DateTime 对象之间的差异 [已关闭,使用 NodaTime] [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何比较 PHP 5.2.8 中的两个 DateTime 对象?

c#如何计算两个日期之间相隔天数

如何从 MySql 数据库中获取日期到 C# DateTime 对象?

Python标准库datetime之datetime模块详解

Python之time与datetime模块

在 Python 中,如何将 `datetime` 对象转换为秒?