如何计算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;
}

如何计算List<;时间跨度>;

我同意其他人关于使用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时间来计算的。如果你有一个列表。总时间是。可以通过减去列表中的相邻索引并加上每一个减法来计算,但这应该与从中减去列表中第一个项目的时间相同