2

宿題のように聞こえますか?いいえ、ちがいます。私はこのためのロジックを作成しましたが、日付が何年にもわたる場合はそれほどパフォーマンスの高いものではありません。基本的にここにそれがどのように機能するべきかがあります、

StartDate: 1/1/2012

FinishDate: 1/10/2012 

RecurringInterval: 2 ( In days)

出力は次のようになります。

1/6/2012今日の日付(Date.Now)が1/5/2012(フォーマットを想定MM/dd/yyyy)の場合。終了日に達するとチェックは終了します。指定された期間内に一致する日付がない場合は、今日の日付を返す必要があります。非常に単純ですが、効率的なものではありません。

これの何が問題になっていますか?

if (!_isRecurring)
    return DateTime.UtcNow;
DateTime initialDate = _startDate;
DateTime finalDate = _finishDate;
int recurringDays = _recurringInteral;
/*
 * start Date + recurring interval falls between start date and finishdate then get its date
 */
do
{
    //add recurring day to start date
    initialDate = initialDate.AddDays(recurringDays);
    //check if it falls in between start days and end days
     if(initialDate  <= finalDate)
    break;            
} while (initialDate <= finalDate);
//return the first occurance of the recurring day
return initialDate;
4

1 に答える 1

8

ちょっとした算数で一日を節約できます (しゃれが意図されています):

var start = new DateTime(2012, 1, 1);
var end = new DateTime(2012, 10, 1);
var interval = 2; // days

var today = DateTime.Today;
var diff = (int)((today - start).TotalDays);
var mod = diff % interval;
var correction = TimeSpan.FromDays((mod > interval / 2 ? interval : 0) - mod);
var result = today + correction > end ? today : today + correction;
Console.Out.WriteLine("Result is: {0}", result);

実際に見てください

これが行うことは、今日の「再発スポット」から何日離れているかを計算することです (変数mod)。これは明らかに、>= 0 かつ < 間隔の数値になります。間隔の半分以下の場合は、最も近い再発スポットが今日よりも早いことを意味します。この場合mod、今日から日数を引いてスポットを見つけます。間隔の半分よりも大きい場合はinterval - mod、スポットを見つけるために日数を追加する必要があることを意味します (これは将来になります)。

于 2012-01-14T04:22:21.260 に答える