如何计算List<;时间跨度>;
本文关键字:lt 时间跨度 gt List 何计算 计算 | 更新日期: 2023-09-27 18:24:51
我有一个List<ObjectInstance>
。
ObjectInstance
是一个类,它有两个TimeSpan属性:StartTime和EndTimes。
开始和结束时间可以在上午8点到晚上10点之间。下午5点以后的任何时间都是非高峰时间,否则就是高峰时间。
我需要计算列表中的总高峰时间和总非高峰时间。
做到这一点的最佳方法是什么?
我写的方法非常基本:我写了类似于下面的函数,相对于间隔的开始和结束时间,它有很多关于peakTimeStart在哪里的if条件,但我觉得必须有更好的方法来做到这一点;也许使用LINQ,或者一些扩展方法来调用列表?
public static double CalculateTimeIntervalPeakHours(TimeSpan intervalStart, TimeSpan intervalEnd, TimeSpan peakTimeStart)
{
double peakHours = 0.0;
// some logic here to find where the interval starts & ends relative to the peakTimeStart!
return peakHours;
}
我同意其他人关于使用datetime&同时考虑时区。
从技术角度来看,也许你正在寻找这样的东西——
var sumPeak = list.Where(timeSP => timeSP > intervalStart && timeSP < intervalEnd).Sum(item => item.Milliseconds);
如果你的逻辑不止一行,你可以用这个语法-
var sumPeak = list.Where(timeSP =>
{
// consider this a funtion now.
return timeSP > intervalStart && timeSP < intervalEnd;
})
.Sum(item => item.Milliseconds);
假设你的逻辑超过3-4行。我建议做一个函数&这样打电话-
var sumPeak = list.Where(timeSP => SelectIntervals(timeSP)).Sum(item => item.Milliseconds);
private bool SelectIntervals(TimeSpan timeSP)
{
throw new NotImplementedException();
}
即使使用日期时间,这样的表达式也会派上用场。
假设您的类类似于
class ObjectInstance
{
public TimeSpan StartTime, EndTime;
}
其中,StartTime
是区间的包含开始,EndTime
是区间的独占结束,EndTime > StartTime
。
首先,让我们在类中封装峰值/非峰值逻辑
class ObjectInstance
{
public TimeSpan StartTime, EndTime;
public TimeSpan PeakTime(TimeSpan peakTimeStart)
{
return Fit(peakTimeStart) - StartTime;
}
public TimeSpan OffPeakTime(TimeSpan peakTimeStart)
{
return EndTime - Fit(peakTimeStart);
}
private TimeSpan Fit(TimeSpan value)
{
return value < StartTime ? StartTime : value > EndTime ? EndTime : value;
}
}
现在有
IEnumerable<ObjectInstance> list = ...;
TimeSpan peakTimeStart = ...;
使用Enumerable.Agregate 可以很容易地计算总时间
var totalPeakTime = list.Aggregate(TimeSpan.Zero,
(total, item) => total + item.PeakTime(peakTimeStart));
var totalOffPeakTime = list.Aggregate(TimeSpan.Zero,
(total, item) => total + item.OffPeakTime(peakTimeStart));
更容易计算总小时数
var totalPeakHours = list.Sum(item => item.PeakTime(peakTimeStart).TotalHours);
var totalOffPeakHours = list.Sum(item => item.OffPeakTime(peakTimeStart).TotalHours);
时间跨度是两个DataTime对象之间的差异。您需要将TimeSpan替换为DataTime。DateTime已经在您的计算机UTC时间中,因此不需要处理夏令时。将时间输入程序或输出时,将使用计算机中的时区设置在UTC和本地时间之间进行转换。所以所有的数学运算都是用UTC时间来计算的。如果你有一个列表。总时间是。可以通过减去列表中的相邻索引并加上每一个减法来计算,但这应该与从中减去列表中第一个项目的时间相同