如何在"年"中准确区分两个DateTime对象[关闭,使用NodaTime]

Ani*_*nge -3 c#

如何准确地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);
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 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;
Run Code Online (Sandbox Code Playgroud)

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

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

var today = clock.Now.InZone(zone).LocalDateTime.Date;
Run Code Online (Sandbox Code Playgroud)

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