拆分 DateTimes 范围的有效方法
Effecient way to split range of DateTimes
我有两个 DateTime,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
这是一种可以进行所需分区的方法。请注意,没有检查以确保初始 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
循环中或通过调用 ToList
或 ToArray
来获取值。此外,它还使用 C# 7 中的值元组。您可以改为使用 Tuple<DateTime, DateTime>
或自定义类型。
我有两个 DateTime,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
这是一种可以进行所需分区的方法。请注意,没有检查以确保初始 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
循环中或通过调用 ToList
或 ToArray
来获取值。此外,它还使用 C# 7 中的值元组。您可以改为使用 Tuple<DateTime, DateTime>
或自定义类型。