计算两个日期之间的差异并获得年值? [复制]
Posted
技术标签:
【中文标题】计算两个日期之间的差异并获得年值? [复制]【英文标题】:Calculate the difference between two dates and get the value in years? [duplicate] 【发布时间】:2011-03-10 08:09:51 【问题描述】:可能重复:How do I calculate someone’s age in C#?
我想基本上计算员工的年龄 - 所以我们有每个员工的 DOB,等等 C# 方面我想做这样的事情 -
int age=Convert.Int32(DateTime.Now-DOB);
我可以使用天数并进行操作,然后得到年龄......但我想知道是否有什么东西可以直接用来得到年数。
【问题讨论】:
【参考方案1】:您要计算员工的年龄吗?然后就可以使用这个sn-p(来自Calculate age in C#):
DateTime now = DateTime.Today;
int age = now.Year - bday.Year;
if (bday > now.AddYears(-age)) age--;
如果不是,请说明。我很难理解你想要什么。
【讨论】:
是的,这就是我想要做的……抱歉措辞不好…… 你好,为什么要在第 3 行减年龄? @WTFZane 因为如果那一年的日期大于当年的日期,那么他们还不是那个年龄。例如出生日期 = 30/5/2000。今天 = 2010 年 4 月 30 日。 age = 10。然后调整为 9,因为他们只有 9 岁。 请注意,对于 2 月 29 日出生的任何人,在非闰年的生日是 3 月 1 日(即“2 月 28 日之后的一天”),在某些国家/地区(例如英国),这将失败 1 天)。这是因为AddYears()
为任何非闰年返回 2 月 28 日(如果输入的出生日期是有效的 2 月 29 日)。一个理想的解决方案是将国家作为参数:)
这样做同时考虑闰年 DateTime.Today.Year - DateOfBirth.Year +(DateTime.Today.DayOfYear
【参考方案2】:
减去两个DateTime
得到一个TimeSpan
。不幸的是,它返回的最大单位是天。
虽然不准确,但您可以估计它,如下所示:
int days = (DateTime.Today - DOB).Days;
//assume 365.25 days per year
decimal years = days / 365.25m;
编辑:哎呀,TotalDays 是双精度数,Days 是整数。
【讨论】:
很好的答案!我想知道与 365.25 的除法。为什么不只是365.0。我在其他主题中也发现了这一点,想知道您是否可以启发我。 .25 是闰年 我还修复了它使用 Days 而不是 TotalDays。 TotalDays 是双精度数,而不是整数。因为无论如何我们都不关心部分日子...... 这并不完全准确。我们并不总是每四年有一个闰年。 @matt-dot-net 因为唯一重要的时间是 115 岁以上的人,我相信它在大多数情况下都可以工作。【参考方案3】:在this 网站上,他们有:
public static int CalculateAge(DateTime BirthDate)
int YearsPassed = DateTime.Now.Year - BirthDate.Year;
// Are we before the birth date this year? If so subtract one year from the mix
if (DateTime.Now.Month < BirthDate.Month || (DateTime.Now.Month == BirthDate.Month && DateTime.Now.Day < BirthDate.Day))
YearsPassed--;
return YearsPassed;
【讨论】:
这应该是公认的答案。又好又简单 请注意,您可以使用 DateTime.Now.Month 【参考方案4】: private static Int32 CalculateAge(DateTime DOB)
DateTime temp = DOB;
Int32 age = 0;
while ((temp = temp.AddYears(1)) < DateTime.Now)
age++;
return age;
【讨论】:
除以 365 不能处理闰年,实际上除以 365.25 也不能准确地处理闰年。 这实际上更接近于一个可行的解决方案,但它已经过时了。在您的具体示例中应该是<= DateTime.Now
。在您的示例中出生于 28/1/1980 -> 28/1/1981 = 0【参考方案5】:
Math.Round(DateTime.Now.Subtract(DOB).TotalDays/365.0)
正如所指出的,这行不通。你必须这样做:
(Int32)Math.Round((span.TotalDays - (span.TotalDays % 365.0)) / 365.0);
在这一点上,另一个解决方案不那么复杂,并且在更大的跨度上继续保持准确。
编辑2,怎么样:
Math.Floor(DateTime.Now.Subtract(DOB).TotalDays/365.0)
天啊,这些天我的基础数学很烂……
【讨论】:
这显然只适用于较短的跨度,但如果没有人会超过 150 岁...... 是的,它不起作用。 Timespan 需要一个“TotalYears”属性:-) 很抱歉在这里鞭打死马,但这也没有考虑闰年,所以它会在短短 1 年的时间跨度内返回不正确的结果。【参考方案6】:(DateTime.Now - DOB).TotalDays/365
从另一个 DateTime 结构中减去一个 DateTime 结构会得到一个 TimeSpan 结构,它具有 TotalDays... 属性,然后除以 365
【讨论】:
不是每年都有 365 天...以上是关于计算两个日期之间的差异并获得年值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
获取 JavaScript 中两个日期之间的差异? [复制]