【发布时间】:2013-04-30 09:09:04
【问题描述】:
我有一个工作项目列表。每个工作项都有开始和结束时间。
所以,基本上是这样的:
List<Work> works = new List<Work>();
works.Add(new Work(
new DateTime(2013, 4, 30, 9, 0, 0),
new DateTime(2013, 4, 30, 11, 0, 0));
现在我想得到工作的总时间。同样,基本上这很容易:
09:00-11:00 => 2 hours
13:00-17:00 => 4 hours
----
06:00 hours
这只是总和。
但现在变得很困难:如果我想提取并行时间,我该如何计算这个总和?
例如,
09:00-11:00 => 2 hours
10:00-11:30 => 1.5 hours
13:00-17:00 => 4 hours
----
06:30 hours
是 6.5 小时,但总和是 7.5 小时。两个工作项映射到 10 点到 11 点之间的时间这一事实有所不同。
对于可以以基本上所有可能的方式(周围、开始重叠、结束重叠,包括)相互重叠的任意数量的工作项,我该如何解决这个问题?
【问题讨论】:
-
是否有设定的时间间隔(例如,最短 0.5 小时)?如果是这样,一个简单的方法是每半小时检查一次围绕它的工作项,然后将它们全部加起来。
-
很遗憾,时间完全是任意的,可能从几秒到几天不等。
-
我现在使用这个库解决了这个问题:简单,直接,并且可以工作:-)
-
作为一个实际问题,也要注意模棱两可的时间。您使用的
DateTime值具有.Kind == Unspecified。如果这些来自 UTC,你就可以了。如果它们来自某个本地时区,那么在穿越夏令时转换时,您的数学可能会出错。如果你不能使用 UTC,你应该使用DateTimeOffset来代替。一般来说,“未指定”或“本地”DateTime值对于数学来说是不安全的。
标签: c# algorithm datetime time timespan