【问题标题】: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);

我可以使用天数并进行操作,然后得到年龄......但我想知道是否有什么东西可以直接用来得到年数。

【问题讨论】:

    标签: c# datetime timespan


    【解决方案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 天...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    相关资源
    最近更新 更多