如何在“年”中准确区分两个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; }
这说明了闰年,并将在他们的生日正好增加年龄。