如何在C#中使用AddYears方法获取2月29日

时间:2019-03-05 10:31:13

标签: c# .net datetime leap-year

我们使用每天运行的工作,并在一年前的一天执行一些操作。 实际上,我们只使用类似DateTime.UtcNow.AddYears(1)的名称。 但是使用这种技术似乎无法获得2月29日(例如2020年):

var target = new DateTime(2020, 2, 29);
bool result = (target == target.AddYears(-1).AddYears(1));//false

那么将来是否有可能以2月29日为目标?

5 个答案:

答案 0 :(得分:4)

不。 Documentation指出:

  
      
  • 如果value + DateTime.Year也是a年,则返回值表示该年的the日。例如,如果将2012年2月29日添加为四年,则返回的日期为2016年2月29日。

  •   
  • 如果value + DateTime.Year不是a年,则返回值表示该年the日的前一天。例如,如果将2012年2月29日添加一年,则返回的日期是2013年2月28日。

  •   

这意味着,如果加上一年,则总是2月28日。通过AddYears获得第29位的唯一方法是添加4的倍数。

答案 1 :(得分:4)

不,这是design来的。

  

如果当前实例表示a年中的the日,则   返回值取决于目标日期

     
      
  • 如果value + DateTime.Year也是a年,则返回值   代表该年的the日。例如,如果四年是   添加到2012年2月29日,返回的日期是2016年2月29日。

  •   
  • 如果value + DateTime.Year不是a年,则返回值   表示当年 day日的前一天。例如,如果   在2012年2月29日加上一年,返回的日期是2月   2013年2月28日。

  •   

2020年2月29日之后的1年应为 2021年2月28日,因为它不是a年。但是在这种情况下,2021年之后的所有年份都将作为2月28日。

除此之外,问自己,“年份”对您来说意味着什么?一个月中有几天?一年多少天?是365吗? 366?还是wikipedia stated 365.2425?另外,我们在谈论哪个日历?

框架,库等。的工作方式像人们认为的那样。它们基于之前定义的一组规则进行工作。 .NET Framework对此规则进行了定义。因此,当您向DateTime实例添加年份时,他们决定月份​​部分必须保持不变,年份部分将更改要添加多少年,并且日期部分必须为有效一个。

答案 2 :(得分:0)

您可以改用“ 3月1日之前的一天”来作弊。

存根:

DateTime today = DateTime.UtcNow
if (today.month == 2)
{
  if(today.day == 28 || today.day == 29)
  {
    today.AddDays(1).AddYears(1).AddDays(-1)
   }
}

这会将您的2月28日转换为3月1日的非-年,再加上一年,然后再到前一天。 如果明年也不是a年,您仍然会得到2月28日,但是如果明年是a年,结果将是2月29日。

这还不能解决今年是a年的情况,因为该代码将改为返回2月27日

答案 3 :(得分:0)

返回下一个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++;
            }
        }
    }
}

答案 4 :(得分:-1)

正如NibblyPig所说,这是不可能的。但是,如果您实际上只是在寻找月底,则可以使用new DateTime(year, month + 1, 0).AddDays(-1)