2013-03-21 67 views
-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对象?

我需要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... 
} 

感谢

+0

那么这个问题有什么问题:/ – user2043533 2013-03-21 14:30:06

+0

试着弄清楚你的问题的更好的解释。目前还不清楚 – 2013-03-21 14:31:08

+1

[神圣记录蝙蝠侠!](http://msdn.microsoft.com/en-us/library/system.datetime_methods.aspx)AddDays,AddMonths,... – 2013-03-21 14:37:33

回答

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

+0

不完全,请参阅关于二月份的警告... – user2043533 2013-03-21 14:40:52

+0

是的,您在我的回答后更新了问题。我必须考虑更好的解决方案。 – 2013-03-21 14:42:52

+0

@ user2043533你是什么意思“不完全”?你认为AddMonths是如此破碎是否会给你不存在的日期? – MikeSmithDev 2013-03-21 14:55:48