C# 寻找下一个再次发生的日期
我有重复出现的任务,我正在构建一些可以自动为我重新创建它们的东西 我有这个枚举:C# 寻找下一个再次发生的日期,c#,asp.net,date,C#,Asp.net,Date,我有重复出现的任务,我正在构建一些可以自动为我重新创建它们的东西 我有这个枚举: public enum Periods { Day = 0, //every day Week = 1, //every week... BiWeek = 2, //every 2nd week Month = 3, BiMonth = 4, Year = 5 }; 我需要能够在这些时间间隔内重新创建 因此,我可能在每个月的29号都
public enum Periods {
Day = 0, //every day
Week = 1, //every week...
BiWeek = 2, //every 2nd week
Month = 3,
BiMonth = 4,
Year = 5
};
我需要能够在这些时间间隔内重新创建
因此,我可能在每个月的29号都会发生一些事情。如果29日不存在,比如2月,那么它应该跳到下一个最好的日子,也就是3月1日
是否有一种算法可以做到这一点,可能是使用DateTime对象
我需要ex:
DateTime GetNextOccurrence(DateTime initialDate, DateTime lastOccurrence, Periods p)
{
if(p == Day)
return lastOccurance.addDays(1);
else if (p == Month)
{
add 1 month to last occurance month then start at day 1 of the month and keep adding days until it gets as close as possible...
}
谢谢这是一个硬代码解决方案,但如果您提供更通用的条件,则可以更轻松地改进:
private static DateTime GetNextOccurrence(DateTime initialDate,
DateTime lastOccurrence,
Periods p)
{
switch (p)
{
case Periods.Day: return lastOccurrence.AddDays(1);
case Periods.Week: return lastOccurrence.AddDays(7);
case Periods.BiWeek: return lastOccurrence.AddDays(14);
case Periods.Month:
case Periods.BiMonth:
{
DateTime dt = lastOccurrence.AddMonths(p == Periods.Month ? 1 : 2);
int maxDays = DateTime.DaysInMonth(dt.Year, dt.Month);
int days = Math.Min(initialDate.Day, maxDays);
return new DateTime(dt.Year, dt.Month, days);
}
case Periods.Year: return lastOccurrence.AddYears(1);
default: return lastOccurrence;
}
}
更新后的版本甚至更多地进行了编码,但我更新了代码以解决
AddMonth
caveat。与您想要的唯一细微区别是,日期不会转移到下个月,但自行车会保留下来。那么这个问题有什么问题吗?/试着对您的问题做出更好的解释。现在还不清楚AddDays,AddMonths,…也许DDay.iCal库能帮上忙。我不知道initialDate
在哪里起作用?不太清楚,请参见关于二月的警告……是的,您在我回答后更新了问题。我必须考虑更好的解决办法。@user2043533“不完全”是什么意思?你认为AddMonths会给你一个根本不存在的日期吗?不,但假设它必须发生在每个月的29日,AddMonths会把你带到3月1日,但下个月应该是3月29日,而不是4月1日…@user2043533这就是为什么你会将月份添加到原来的日期。。。好吧,你说得对,我知道他的回答有什么问题。