计算人员成为特定年龄的日期

时间:2017-06-07 06:56:41

标签: c# date

考虑到闰年,我试图计算一个人年满18岁的日期。

有人可能会认为仅仅添加18年就足够了:

birthDay.AddYears(18);

但如果生日是2000年2月29日,这将导致2018年2月28日。我相信正确答案必须是2018年3月1日。

我找到了一种方法,但我想知道是否有更简单的方法。

birthday.AddDays(-1).AddYears(18).AddDays(1);

我认为这个问题的答案已经存在于StackOverflow上,但我的所有搜索都只会出现关于在特定日期计算年龄的问题。

我认为我的问题不是Behavior of DateTime.AddYears on leap year的重复,因为只能解释AddYears的工作原理。它不包含执行计算的代码。

我发现quora article表示你在18岁的官方日期在新西兰与英国不同。

1 个答案:

答案 0 :(得分:1)

我建议隐藏逻辑(将向上舍入到1 Mar而不是将向下舍入到28 Feb扩展方法

public static partial class DateTimeExtensions {
  public static DateTime AddYearsUp(this DateTime value, int amount) {
    // Business as usual: neither days are leap days or both days are leap days
    if (value.Month != 2 || value.Day != 29 || DateTime.IsLeapYear(value.Year + amount))
      return value.AddYears(amount);

    // We want 29 Feb to be turned into 1 Mar (not 28 Feb)
    return new DateTime(value.Year + amount, 3, 1, 
                        value.Hour, value.Minute, value.Second, value.Millisecond);
  }
}

然后使用实施的方法:

var result = birthDay.AddYearsUp(18); 

请注意,你当前的逻辑

birthday.AddDays(-1).AddYears(18).AddDays(1);

不正确;反例是

// 1 Mar 1998
var birthday = new DateTime(1998, 3, 1);

// Expected:  1 Mar 2016
// Actual:   29 Feb 2016
var result = birthday.AddDays(-1).AddYears(18).AddDays(1);