考虑到闰年,我试图计算一个人年满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岁的官方日期在新西兰与英国不同。
答案 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);