Расчет часового распределения минут в каждом часе за период времени - PullRequest
1 голос
/ 06 ноября 2019

Я пытаюсь получить разбивку по минутам в каждом часе за определенный период времени. Например, допустим, у меня есть два DateTimes, например, так:

DateTime onTime = new DateTime(2019, 11, 6, 6, 30, 0);
DateTime offTime = new DateTime(2019, 11, 6, 10, 45, 0);

Итак, есть два DateTimes, представляющих:

"2019-11-06 06:30:00"
"2019-11-06 10:45:00"

Что я пытаюсь достичь, так это почасовая разбивка минут вкаждый час за данный период. Я ожидал бы, что это будет выглядеть примерно так:

int 6 = 30; // Hour 6 = 30 minutes
int 7 = 60; // Hour 7 = 60 minutes
int 8 = 60; // Hour 8 = 60 minutes
int 9 = 60; // Hour 8 = 60 minutes
int 10 = 45; // Hour 10 = 45 minutes

Я могу решить, использовать ли LINQ или просто итеративную функцию с собственными ссылками для желаемого эффекта.

1 Ответ

4 голосов
/ 06 ноября 2019

Единственными интересными значениями являются первый компонент и последний компонент, все остальные будут 60 независимо от того, что (если есть разрыв не менее одного часа). Вот почему я хотел бы использовать следующий код:

public static IEnumerable<int> GetBreakdown(DateTime onTime, DateTime offTime) {
    if (offTime < onTime) {
        throw new ArgumentException();
    }

    // Case where the two times start at the same hour
    if (onTime.Hour == offTime.Hour) {
        yield return offTime.Minute - onTime.Minute;
        yield break;
    }

    // Nominal case
    yield return 60 - onTime.Minute;
    for (int i = onTime.Hour + 1; i < offTime.Hour; i++) {
        yield return 60;
    }
    if (offTime.Minute != 0) {
        yield return offTime.Minute;
    }
}

, который вы можете использовать следующим образом:

DateTime onTime = new DateTime(2019, 11, 6, 6, 30, 0);
DateTime offTime = new DateTime(2019, 11, 6, 10, 45, 0);
foreach (var value in GetBreakdown(onTime, offTime)) {
    Console.WriteLine(value);
}
// Prints:
// 30
// 60
// 60
// 60
// 45

Обратите внимание, что предполагается, что оба находятся в один и тот же день,не учитывать Date компонент входов. Отсюда вы можете легко изменить тип возврата с IEnumerable<int> на IEnumerable<(int, int)> и внести изменения, чтобы возвращать компонент часа в каждом yield.

...