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 回答