【问题标题】:Age in years with decimal precision given a datetime在给定日期时间的情况下,以小数为单位的年龄
【发布时间】:2009-03-23 14:10:33
【问题描述】:

如何在 C# 日期时间中根据出生日期获取某人的年龄。

我想要一个准确的年龄,比如 40.69 岁

【问题讨论】:

标签: c# datetime


【解决方案1】:

这将计算确切的年龄。年龄的小数部分是相对于上一个生日和下一个生日之间的天数计算的,因此它可以正确处理闰年。

小数部分在一年中是线性的(并且不考虑月份的不同长度),如果您想表达小数年龄,这似乎最有意义。

// birth date
DateTime birthDate = new DateTime(1968, 07, 14);

// get current date (don't call DateTime.Today repeatedly, as it changes)
DateTime today = DateTime.Today;
// get the last birthday
int years = today.Year - birthDate.Year;
DateTime last = birthDate.AddYears(years);
if (last > today) {
    last = last.AddYears(-1);
    years--;
}
// get the next birthday
DateTime next = last.AddYears(1);
// calculate the number of days between them
double yearDays = (next - last).Days;
// calcluate the number of days since last birthday
double days = (today - last).Days;
// calculate exaxt age
double exactAge = (double)years + (days / yearDays);

【讨论】:

  • 在获取下一个生日行时,AddYears 没有正确处理关于年龄的闰年。假设您的生日是 2008 年 2 月 29 日。如果您添加 1 年,则会得到 2008-02-28 而不是 2008-03-01。
  • 应该是:如果你加上 1 年,它会给你 2009-02-28 而不是 2009-03-01。
  • 我想这取决于您是否将 2008-02-29 视为 2008-02-28 后一天或 2008-03-01 前一天...我同意两者都不是正确。
【解决方案2】:

这是一个近似计算:

 TimeSpan span = DateTime.Today.Subtract(birthDate);
 Console.WriteLine( "Age: " + (span.TotalDays / 365.25).toString() );

顺便说一句:另请参阅 Stack Overflow 上的这个问题:How do I calculate someone’s age in C#?

【讨论】:

  • .25 代表闰年。
  • 您可以使用“span.TotalDays”来更好地近似
  • 为什么每个人都建议使用.Subtract()?我更喜欢“DateTime.Today -birthDate”:)
【解决方案3】:

一个近似值是:

        DateTime bd = new DateTime(1999, 1, 2);

        TimeSpan age = DateTime.Now.Subtract(bd);
        Console.WriteLine(age.TotalDays / 365.25);

【讨论】:

    【解决方案4】:

    40 年很简单。但是要获得真正准确的小数点,我不确定您如何将其余的年龄转换为十进制数。您会看到年龄以年、月、日、小时、秒表示。而且计算不是那么容易。你必须处理周年纪念日。就像某人在 1 月 31 日出生,他们是 1 个月大吗?答案是 3 月 1 日。但有些年份是 28 天后,有些年份是 29 天后。 Here 是我尝试处理的一个 javascript 实现。

    但我想小数可以表示自最近的生日周年纪念日以来的天数除以下一个生日周年纪念日的天数。如果您想要更精确,您可以使用相同的原理在几秒钟内完成。

    但我认为它不能很好地代表一个时代。我们只是通常不代表这样的年龄。

    并确保您的日期时间在同一时区进行比较。

    【讨论】:

      【解决方案5】:

      你可以这样做:

      Console.WriteLine(DateTime.Now.Date.Subtract(new DateTime(1980, 8, 1)).TotalDays / 365.25);
      

      【讨论】:

        【解决方案6】:

        小数部分允许有多少错误?准确的年龄是

        31 年、10 天、3 小时等,具体取决于所需的精度。

        【讨论】:

          猜你喜欢
          • 2013-06-11
          • 1970-01-01
          • 2014-02-27
          • 2011-06-10
          • 2019-10-11
          • 1970-01-01
          • 1970-01-01
          • 2015-09-16
          • 2014-08-23
          相关资源
          最近更新 更多