我有重复的任务,我正在构建一些可以自动为我重新创建它们的东西。
我有这个枚举:
public enum Periods {
Day = 0, //every day
Week = 1, //every week...
BiWeek = 2, //every 2nd week
Month = 3,
BiMonth = 4,
Year = 5
};
我需要能够在这些时间间隔内重新创建。
因此,我可能会在每个月的29日重新出现这种情况。如果29日不存在,就像二月那样,那么它应该跳到下一个最好的东西,即3月1日。
是否有算法执行此操作,可能使用DateTime对象?
我需要前:
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...
}
由于
答案 0 :(得分:3)
这是一种硬编码解决方案,但如果您提供更通用的条件,那么更容易做出更好的事情:
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
警告。与你想要的唯一的微小差别是,日期不会转移到下个月,但会保留骑行。