找到下一个重复日期

时间:2013-03-21 14:28:28

标签: 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日重新出现这种情况。如果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...
}

由于

1 个答案:

答案 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警告。与你想要的唯一的微小差别是,日期不会转移到下个月,但会保留骑行。