7

我有一个带有两个DateTime参数的函数,我必须为这些日期添加单独的偏移量。我知道它DateTime具有将日期添加到日期的功能,如果小于或大于AddDays,它会引发异常。DateTimeMinValueMaxValue

现在我想做一个安全的检查,是否在 a 中添加/减去以下天数是否DateTime会导致流量过多/不足。

safeStartDate = (startDate == DateTime.MinValue || startDate == DateTime.MaxValue) ? startDate : startDate.AddDays(startDateOffset);
safeEndDate = (endDate == DateTime.MaxValue || endDate == DateTime.MinValue) ? endDate : endDate.AddDays(enDateOffset);

通过这样做,我将其设为免费的一级异常,但日期可以是DateTime.Max - 1并且在尝试添加偏移量时会引发异常。我正在寻找一种更好的方法,即最终值是否超过/低于流动而不进行实际计算,以防止异常。

4

4 回答 4

9

如果不经常调用 catch,您可以执行以下操作:

try
{
    safeDate = dt.AddDays(days);
}
catch (ArgumentOutOfRangeException)
{
    safeDate = date;
}

或者,

var maxDays = (DateTime.MaxValue - dt).TotalDays;
safeDate = (days <= maxDays) ? dt.AddDays(days) : dt;

或者如果有负面的日子:

var maxDays = (DateTime.MaxValue - dt).TotalDays;
var minDays = (DateTime.MinValue - dt).TotalDays;
return (minDays <= days && days <= maxDays) ? dt.AddDays(days) : dt;

或者只是使用Rawling 的答案中的方法:CanAddDays(dt, days) ? dt.AddDays(days) : dt

如果你不捕捉,try/catch 版本的速度大约快 25%,如果你捕捉,速度大约慢 1000 倍。因此,如果您希望在每 5000 次使用中捕获超过 1 次,请使用第二个版本。

于 2013-02-28T13:26:20.600 回答
5

您可以使用以下内容检查是否可以将给定的天数添加到给定的天数DateTime而不会导致溢出:

bool CanAddDays(DateTime dt, int days)
{
    double maxDaysToAdd = (DateTime.MaxValue - dt).TotalDays;
    double minDaysToAdd = (DateTime.MinValue - dt).TotalDays;
    return days <= maxDaysToAdd && days >= minDaysToAdd;
}
于 2013-02-28T13:32:57.530 回答
0

我猜你正在寻找这样的东西

DateTime Now = DateTime.Now;
DateTime Max = DateTime.MaxValue;
Max.Subtract(Now);
int DaysToAdd = 1000;//or something else
if (Max.Day > DaysToAdd) Now.AddDays(DaysToAdd);//add        
于 2013-02-28T13:32:20.710 回答
0

您可以考虑以下方法:

private static DateTime AddDays(DateTime dateTime, int days)
{
    var daysTimeSpanTicks = (new TimeSpan(days, 0, 0, 0)).Ticks;
    return (days >= 0) ?
        (DateTime.MaxValue.Ticks < dateTime.Ticks + daysTimeSpanTicks) ? dateTime : dateTime.AddDays(days) :
        (dateTime.Ticks + daysTimeSpanTicks < 0) ? dateTime : dateTime.AddDays(days);
}

示例用法是:

DateTime date = DateTime.MinValue;
DateTime safe = AddDays(date, -100);
于 2013-02-28T13:52:40.507 回答