我们使用每天运行的工作,并提前一年执行一些操作。实际上我们只使用类似的东西:DateTime.UtcNow.AddYears(1)。但似乎不可能获得2月29日(例如…
正如NibblyPig所说,这是不可能的。但是,如果您实际上只是在寻找月底,那么您可以使用 new DateTime(year, month + 1, 0).AddDays(-1)
new DateTime(year, month + 1, 0).AddDays(-1)
没有 文档 状态:
如果value + DateTime.Year也是闰年,则返回值表示该年的闰日。例如,如果在2012年2月29日添加四年,则返回日期为2016年2月29日。 如果value + DateTime.Year不是闰年,则返回值表示该年中闰日之前的前一天。例如,如果在2012年2月29日添加一年,则返回日期为2013年2月28日。
如果value + DateTime.Year也是闰年,则返回值表示该年的闰日。例如,如果在2012年2月29日添加四年,则返回日期为2016年2月29日。
如果value + DateTime.Year不是闰年,则返回值表示该年中闰日之前的前一天。例如,如果在2012年2月29日添加一年,则返回日期为2013年2月28日。
这意味着如果您添加一年,您将始终获得2月28日。获得29洞的唯一途径 AddYears 如果你添加4的倍数。
AddYears
你可以通过“3月1日前一天”来欺骗系统。
存根:
DateTime today = DateTime.UtcNow if (today.month == 2) { if(today.day == 28 || today.day == 29) { today.AddDays(1).AddYears(1).AddDays(-1) } }
这将在3月1日在非闰年转换你的2月28日,增加一年,然后到前一天。 如果明年也不是一个年级,你仍然会得到28日元,但如果明年是一个飞跃,结果将是29日。
这还没有解决今年是一个飞跃的情况,因为这个代码将在27日返回而不是
不,这是 设计 。
如果当前实例代表闰年的闰日,那么 回报价值 的 取决于目标日期 强> : 如果 value + DateTime.Year 也是闰年,回报价值 代表那一年的闰日。例如,如果是四年 添加到2012年2月29日,返回日期为2016年2月29日。 如果 value + DateTime.Year 不是闰年,回报价值 代表 的 闰日前一天 强> 在那年。例如,如果 一年添加到2012年2月29日,返回的日期是2月 2013年8月28日。
如果当前实例代表闰年的闰日,那么 回报价值 的 取决于目标日期 强> :
如果 value + DateTime.Year 也是闰年,回报价值 代表那一年的闰日。例如,如果是四年 添加到2012年2月29日,返回日期为2016年2月29日。
value
DateTime.Year
如果 value + DateTime.Year 不是闰年,回报价值 代表 的 闰日前一天 强> 在那年。例如,如果 一年添加到2012年2月29日,返回的日期是2月 2013年8月28日。
在2020年2月29日之后的1年 应该 自2021年2月28日以来 不 闰年。但在这种情况下,2021年之后的所有年份都将在2月28日起作用。
除此之外,问问自己,“年”对你来说意味着什么?一个月多少天?一年多少天?是365吗? 366?或者作为 维基百科说 365.2425?还有,我们在谈论哪个日历?
框架,图书馆等..的确如此 不 像人们想的那样工作。它们基于之前定义的一组规则工作。 .NET Framework定义了此规则。所以,当你添加一年 DateTime 例如,他们决定月份部分必须保持不变,年份部分将改变多少年,并且当天部分必须是 有效 一。
DateTime
返回下一个29.Feb的功能。也许有帮助。 使用系统;
public class Program { public static DateTime NextTwentyNineFeb() { int year = DateTime.Now.Year; while(true){ try{ var target = new DateTime(year, 2, 29); Console.WriteLine(target); return target; } catch { year++; } } } }