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

Check if adding TimeSpans exceeds TimeSpan.MaxValue

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

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

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

System.OverflowException : TimeSpan overflowed because the duration is too long.

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

我是否必须围绕它放置一个 try-catch 或编写我自己的扩展方法?似乎这应该是 .Net 框架的一部分 - 默认为 MaxValue 或具有 TryAdd 方法。

我最终为 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;
}

我会使用代数,并将所有内容保持在 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 而无需将其转换为其他单位,并且您可以放心,无论转换过程中可能出现其他潜在问题,添加都会起作用(我认为这是安全的假设 TimeSpan 范围不会改变,以至于 TotalMinutes 不再足够,但是当您接近TimeSpan.MinValueTimeSpan.MaxValue) 的限制。