计算两个日期之间的差异并获得年值? [复制]

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 也不能准确地处理闰年。 这实际上更接近于一个可行的解决方案,但它已经过时了。在您的具体示例中应该是&lt;= 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 中两个日期之间的差异? [复制]

如何在 android 中获得两个日期之间的差异?,尝试所有事情并发布

如何获得两个日期之间的差异(informix)?

如何计算两个日期之间的天数? [复制]

如何获得两个日期对象之间的小时差? [复制]

在 C# 中比较两个日期并计算差异