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这就是为什么你会将月份添加到原来的日期。。。好吧,你说得对,我知道他的回答有什么问题。