Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算某人达到某一年龄的日期_C#_Date - Fatal编程技术网

C# 计算某人达到某一年龄的日期

C# 计算某人达到某一年龄的日期,c#,date,C#,Date,我试图计算一个人18岁的日期,考虑到闰年 有人可能会认为,只需在一个日期上加上18年就足够了: birthDay.AddYears(18); 但如果生日是2000年2月29日,那么这将导致2018年2月28日。我认为正确答案必须是2018年3月1日 我找到了一种方法,但我不知道是否有更简单的方法 birthday.AddDays(-1).AddYears(18).AddDays(1); 我想StackOverflow上已经有了这个问题的答案,但我所有的搜索结果都只显示了关于计算某个特定日期的

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

有人可能会认为,只需在一个日期上加上18年就足够了:

birthDay.AddYears(18);
但如果生日是2000年2月29日,那么这将导致2018年2月28日。我认为正确答案必须是2018年3月1日

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

birthday.AddDays(-1).AddYears(18).AddDays(1);
我想StackOverflow上已经有了这个问题的答案,但我所有的搜索结果都只显示了关于计算某个特定日期的年龄的问题

我不认为我的问题是重复的,因为那个问题只解释了为什么AddYears会这样工作。它不包含执行计算的代码

我发现一个声明,说你18岁的官方日期与英国的New Sealand不同。

我建议将逻辑(四舍五入到3月1日,而不是四舍五入到2月28日)隐藏为扩展方法:

然后使用实现的方法:

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);

当前算法的反例:
新日期时间(1998,3,1).AddDays(-1).AddYears(18).AddDays(1)
:预期的
2016年3月1日
,实际的
2016年2月29日
你看过吗?很多答案都包括你的问题!关于我的代码不正确的可能重复:我dit执行一些测试,但我dit不包括生日在非闰年,而结果日期是闰年的测试。谢谢。@comecme:典型的边界检查过程:
leap
leap
leap
非leap
非leap
leap
(找到反例的情况);如果您有存档数据要处理(爱因斯坦什么时候开始使用
18
?),那么包含
1900
年(非闰年)是合理的。我想我会将您最后的返回语句更改为
返回值。AddYears(amount)。AddDays(1)
。你为什么要像你一样创建一个新的DateTime,有什么特别的原因吗?@comecme:new DateTime()的原因是我想安全起见:我不能保证,比如说,C#8.5,.Net 7.0不会改变逻辑(并开始返回
1 Mar
)。我写下了我的实际意图:如果有疑问(
2月28日
3月1日
?),我想要
3月1日
,而不是“系统解决方案+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);