以特定方式拆分日期范围的问题

Problem with splitting date range in a specific way

假设我有两个像这样的 DateTime 对象,我想将日期范围分成以天为单位的块大小;

var date1 = new DateTime(2022, 3, 1, 8, 30, 0);
var date2 = new DateTime(2022, 3, 5, 11, 30, 0);

这种方法可以完成工作;

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);
}

并给我这样的结果集;

{(1.03.2022 08:30:00, 2.03.2022 08:30:00)}
{(2.03.2022 08:30:00, 3.03.2022 08:30:00)}
{(3.03.2022 08:30:00, 4.03.2022 08:30:00)}
{(4.03.2022 08:30:00, 5.03.2022 08:30:00)}
{(5.03.2022 08:30:00, 5.03.2022 11:30:00)}

我真正需要的是这样的结果集;

{(1.03.2022 08:30:00, 2.03.2022 00:00:00)}
{(2.03.2022 00:00:00, 3.03.2022 00:00:00)}
{(3.03.2022 00:00:00, 4.03.2022 00:00:00)}
{(4.03.2022 00:00:00, 5.03.2022 00:00:00)}
{(5.03.2022 00:00:00, 5.03.2022 11:30:00)}

有什么想法吗?

您可以使用 DateTime.Date 属性 来截断时间部分。

替换下面两行:

yield return Tuple.Create(start, chunkEnd);
start = chunkEnd;

与:

yield return Tuple.Create(start, chunkEnd.Date);
start = chunkEnd.Date;

如果 chuckend 不是集合中的第一项或最后一项,您可以将其时间部分替换为:

chunkEnd = new DateTime(chunkEnd.Year, chunkEnd.Month, chunkEnd.Day, 00, 00, 00);