计算一段时间内每小时的分钟数细分

cul*_*rer 1 c# linq datetime loops

我试图详细了解一段时间内每小时的分钟数。例如,假设我有两个日期时间,如下所示:

DateTime onTime = new DateTime(2019, 11, 6, 6, 30, 0);
DateTime offTime = new DateTime(2019, 11, 6, 10, 45, 0);
Run Code Online (Sandbox Code Playgroud)

所以有两个 DateTime 代表:

"2019-11-06 06:30:00"
"2019-11-06 10:45:00"
Run Code Online (Sandbox Code Playgroud)

我想要实现的是给定时间段内每小时的分钟数细分。我希望它看起来像:

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
Run Code Online (Sandbox Code Playgroud)

我可以确定是尝试使用 LINQ 还是仅使用自引用迭代函数来达到所需的效果。

Cor*_*ane 5

唯一有趣的值是第一个组件和最后一个组件,所有其他值都将是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;
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以这样使用:

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
Run Code Online (Sandbox Code Playgroud)

请注意,它假设两者在同一天,它不考虑Date输入的组成部分。从这里您可以轻松地将返回类型从IEnumerable<int>toIEnumerable<(int, int)>更改为返回每个 中的小时部分yield