查找最接近今天的定期日期-C#
本文关键字:日期 -C# 最接近 今天 查找 | 更新日期: 2023-09-27 18:20:20
听起来像作业?不,不是。我为此制定了逻辑,但当日期跨越多年时,这并不是一个很好的逻辑。基本上是这样工作的
StartDate: 1/1/2012
FinishDate: 1/10/2012
RecurringInterval: 2 ( In days)
输出为:
如果今天日期(Date.Now
)是1/5/2012
(假定格式为MM/dd/yyyy
),则为1/6/2012
。检查将在到达完成日期时结束。如果在给定的时间段内没有匹配的日期,则必须返回今天的日期。非常简单,但效率不高。
这是怎么回事
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;
一点算术应该可以化险为夷(双关语):
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
天才能找到点(这将是在未来)。