我们使用每天运行的工作,并在一年前的一天执行一些操作。
实际上,我们只使用类似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日为目标?
答案 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)