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); |
更重要的是,问题是:如何从时间跨度转换为日期时间。
- 预期结果是什么?
- 你所贴的是做这项工作的吗?
- 我想要datetime.now.Subtract()在datetime中而不是TimeSpan(或从TimeSpan转换为datetime)@jon
- @安尼克:那不能回答我的问题。另外,"X年"不是一个DateTime,它只是有意义的结果作为一个TimeSpan。
- stackoverflow.com/questions/9/how-do-i-calculate-someone-ag‌&8203;e
- 回复:重复:哇。问题9!
- @乔恩,我不想用时间跨度……发布的代码给出了正确的结果
我有偏见,但我会用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属性来稍微减少这个值。)
- 点头很酷。谢谢。
- 是的,我不想以任何可能的方式使用时间跨度。
- 有没有办法把时间跨度转换成日期时间?或者将datetime转换为localdate()?
- @Aniket:你不能从TimeSpan转换成DateTime,不可以,但是你可以使用LocalDateTime.FromDateTime,然后使用Date属性得到LocalDate。
- 啊,酷,还有一个问题,我在哪里可以得到更多关于C(5.0)及其库(标准库)的文档(可能是PDF格式的,这样我就可以得到打印的文档)。同时也感谢你链接到nodatime。我将在当前项目中使用它。
- @Aniket:这是一个很不相关的问题…msdn是存放图书馆资料的最佳位置,C 5规范应该安装在您的Visual Studio目录中。(我认为还没有下载。)
- 我对你在.NET和一般编程方面的详细知识感到惊讶。看了你的演讲"突破语言的界限",你说,阅读规范来理解语言的方式和原因。然后做邪恶的事情,把语言推向极限。
- 并在网上(PDF格式)搜索文档。我找不到它们
- @Aniket:嗯,我怀疑你会发现很多PDF格式的框架文档——这些都是在线网页。规范是在字,但你可以推测打印到PDF。
- 是的,我找到了规格,我正在检查。我只是想对语言有一个深入的了解。在vs/specifications/1033/folder中,是否可以通过相同的规范获得对语言的深入理解?
- 无论您在哪里找到规范,只要您使用的是您想要了解的版本:)与Visual Studio 2012一起安装的版本将用于C 5,所以我将使用它。
- 这太棒了:(-)感谢乔恩的一切,顺便说一句,"查克·诺里斯"式的笑话:"如果乔恩·斯基特是生产者-消费者问题的生产者,消费者永远不会用完他正在消费的任何东西。"
- @请考虑将"使用nodatime计算日期之间的差异"的答案移动/复制/重新创建到非常流行的副本。
- @亚历克赛:会的。
以下是您获得年龄的方法:
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;
} |
这意味着闰年,并且会在他们生日的时候增加年龄。
- 这不是我想要的。我也可以想到这样的算法,但是我想把时间跨度转换成日期时间。
- 啊,对不起,我以为你想让这些年来的不同。
- 这就是为什么我提到"准确":-p.。1 +虽然…好答案。
- 是的,我用"准确"的意思是"给出所有日期的正确年数"。有些算法给出的数据周年纪念日前后的年数是错误的。
- 我知道,因此+1