-3

繰り返し発生するタスクがあり、それらを自動的に再作成するものを構築しています。

私はこの列挙型を持っています:

  public enum Periods {
      Day = 0, //every day
      Week = 1, //every week...
      BiWeek = 2, //every 2nd week
      Month = 3,
      BiMonth = 4, 
      Year = 5
  };

これらの間隔で再現できる必要があります。

したがって、毎月29日に再発することがあるかもしれません。2月のように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...
}

ありがとう

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 に答える