检查添加TimeSpans是否超过TimeSpan.MaxValue

时间:2017-07-20 03:19:40

标签: c# .net timespan

我正在尝试将一些TimeSpans添加到一起进行一些计算 例如:

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

在这种情况下,它将超过TimeSpan.MaxValue并抛出异常

  

System.OverflowException:TimeSpan溢出,因为持续时间太长。

添加TimeSpans的正确方法是什么?

我是否必须在其周围放置try-catch或编写我自己的扩展方法?看起来这应该是.Net框架的一部分 - 默认为MaxValue或者使用TryAdd方法。

2 个答案:

答案 0 :(得分:2)

我会使用代数,并将所有内容保存在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;
}

这样,您可以利用TimeSpan而无需将其转换为其他单元,并且您确信无论转换过程中可能出现的其他潜在陷阱(无论如何都是&#? 39;可以安全地假设TimeSpan范围不会改变,TotalMinutes不再足够,但是当你得到精确的加法结果时,你可能会遇到一些不准确的错误接近TimeSpan.MinValueTimeSpan.MaxValue)的限制。

答案 1 :(得分:0)

我最终为TimeSpan编写了一个扩展方法。还需要检查TimeSpan.MinValue,因为您可以添加负数。我开始检查TimeSpans的Ticks,但我得到了一些奇怪的结果。显然TimeSpan.MinValue.Ticks + TimeSpan.MinValue.Ticks = 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;
}