我正在寻找一种按天的块大小将日期范围划分为一系列日期范围的方法。我打算使用它来缓冲对服务的调用,如果日期范围太大,该服务就会出错。
到目前为止,这是我想出的。看来可行,但是我不确定它是否可以正确退出。似乎以前可能已经做过几次,但是我找不到。
public IEnumerable<Tuple<DateTime, DateTime>> SplitDateRange(DateTime start, DateTime end, int dayChunkSize)
{
var newStart = start;
var newEnd = start.AddDays(dayChunkSize);
while (true)
{
yield return new Tuple<DateTime, DateTime>(newStart, newEnd);
if (newEnd == end)
yield break;
newStart = newStart.AddDays(dayChunkSize);
newEnd = (newEnd.AddDays(dayChunkSize) > end ? end : newEnd.AddDays(dayChunkSize));
}
}
我在寻找改进建议,或者“老兄,为此使用现有功能!”
最佳答案
我认为,当开始和结束之间的差异小于dayChunkSize时,您的代码将失败。
看到这个:
var singleRange = SplitDateRange(DateTime.Now, DateTime.Now.AddDays(7), dayChunkSize: 15).ToList();
Debug.Assert(singleRange.Count == 1);
建议的解决方案:public static IEnumerable<Tuple<DateTime, DateTime>> SplitDateRange(DateTime start, DateTime end, int dayChunkSize)
{
DateTime chunkEnd;
while ((chunkEnd = start.AddDays(dayChunkSize)) < end)
{
yield return Tuple.Create(start, chunkEnd);
start = chunkEnd;
}
yield return Tuple.Create(start, end);
}
关于c# - 将日期范围分为日期范围块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13690617/