代码之家  ›  专栏  ›  技术社区  ›  JumpingJezza

检查添加时间跨度是否超过TimeSpan.MaxValue

  •  3
  • JumpingJezza  · 技术社区  · 7 年前

    我试图添加一些时间跨度在一起进行一些计算。

    var timeSpan1 = new TimeSpan.FromMinutes(1);
    var timeSpan2 = new TimeSpan.MaxValue; 
    var timeSpan3 = timeSpan1 + timeSpan2;
    

    添加时间跨度的正确方法是什么?

    我是否必须对其进行尝试,或者编写自己的扩展方法?似乎这应该是.Net framework的一部分-默认为MaxValue或使用TryAdd方法。

    2 回复  |  直到 7 年前
        1
  •  4
  •   Peter Duniho    7 年前

    我会用代数,把所有的东西都放在 TimeSpan

    public static TimeSpan AddTimeSpan(this TimeSpan ts1, TimeSpan ts2)
    {
        bool sign1 = ts1 < TimeSpan.Zero, sign2 = ts2 < TimeSpan.Zero;
    
        if (sign1 && sign2)
        {
            if (TimeSpan.MinValue - ts1 > ts2)
            {
                return TimeSpan.MinValue;
            }
        }
        else if (!sign1 && !sign2)
        {
            if (TimeSpan.MaxValue - ts1 < ts2)
            {
                return TimeSpan.MaxValue;
            }
        }
    
        return ts1 + ts2;
    }
    

    这样,你就可以利用 时间跨度 在不转换为其他单位的情况下,您可以放心,无论在转换过程中可能出现其他潜在的陷阱(我认为可以安全地假设 时间跨度 TotalMinutes TimeSpan.MinValue TimeSpan.MaxValue ).

        2
  •  0
  •   JumpingJezza    7 年前

    最后,我为TimeSpan编写了一个扩展方法。还需要检查时间跨度。最小值,因为可以添加负数。我开始检查 Ticks 时间跨度,但我得到了一些奇怪的结果。显然是TimeSpan.MinValue。Ticks+TimeSpan.MinValue。刻度=2?

    因此,取而代之的是:

    public static TimeSpan AddTimeSpan(this TimeSpan firstTimeSpan, TimeSpan secondTimeSpan)
    {
        if (firstTimeSpan.TotalMinutes + secondTimeSpan.TotalMinutes > TimeSpan.MaxValue.TotalMinutes)
        {
            return TimeSpan.MaxValue;
        }
        if (firstTimeSpan.TotalMinutes + secondTimeSpan.TotalMinutes < TimeSpan.MinValue.TotalMinutes)
        {
            return TimeSpan.MinValue;
        }
        return firstTimeSpan + secondTimeSpan;
    }