Эффективный способ разделить диапазон DateTimes - PullRequest
0 голосов
/ 18 марта 2020

У меня есть два DateTime's, X и Y. Где X всегда имел место до Y. Они могут быть на миллисекундах или нескольких годах друг от друга. Как я могу в C# эффективно разделить их на дату окончания (00:00)?

E.g (24h clock)

X: 2010-01-01 14:00
Y: 2010-01-02 11:00
Result
2010-01-01 14:00 - 2010-01-02 00:00
2010-01-02 00:00 - 2010-01-02 11:00

-

X: 2010-01-01 05:00
Y: 2010-01-03 18:00
Result
2010-01-01 05:00 - 2010-01-02 00:00
2010-01-02 00:00 - 2010-01-03 00:00
2010-01-03 00:00 - 2010-01-03 18:00

-

X: 2010-01-01 05:00
Y: 2010-01-01 06:00
Result
2010-01-01 05:00 - 2010-01-01 06:00

-

X: 2010-01-01 02:00
Y: 2010-01-04 22:00
Result
2010-01-01 02:00 - 2010-01-02 00:00
2010-01-02 00:00 - 2010-01-03 00:00
2010-01-03 00:00 - 2010-01-04 00:00
2010-01-04 00:00 - 2010-01-04 22:00

1 Ответ

2 голосов
/ 18 марта 2020

Вот метод, который сделает разделение, которое вы хотите. Обратите внимание, что нет никакой проверки, чтобы убедиться, что начальная start предшествует end.

public IEnumerable<(DateTime Start, DateTime End)> DaySplit(DateTime start, DateTime end)
{
    var partition = start.AddDays(1).Date;
    while(partition < end)
    {
        yield return (start, partition);
        start = partition;
        partition = start.AddDays(1);
    }

    yield return (start, end);
}

Обратите внимание, что диапазоны будут создаваться лениво, поэтому вам придется выполнить итерацию для получения значений либо в foreach l oop или позвонив по номеру ToList или ToArray. Кроме того, он использует кортежи значений из C# 7. Вместо этого вы можете использовать Tuple<DateTime, DateTime> или пользовательский тип.

...