-3

我有重复发生的任务,我正在构建一些会自动为我重新创建它们的东西。

我有这个枚举:

  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 对象?

我需要前:

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...
}

谢谢

4

1 回答 1

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警告。与您想要的唯一细微差别是日期不会转移到下个月,但会保留循环。

于 2013-03-21T14:36:20.963 回答