在C#中安全地添加/减去DateTime的日期

Rav*_*pta 5 c# datetime

我有一个带两个DateTime参数的函数,我必须为这些日期添加单独的偏移量.我知道它DateTime有一个AddDays函数来添加日期的日期,如果DateTime小于MinValue或大于,它会引发异常MaxValue.

现在我想做一个安全的检查,是否增加/减去以下天数DateTime会导致流量过高/过低.

safeStartDate = (startDate == DateTime.MinValue || startDate == DateTime.MaxValue) ? startDate : startDate.AddDays(startDateOffset);
safeEndDate = (endDate == DateTime.MaxValue || endDate == DateTime.MinValue) ? endDate : endDate.AddDays(enDateOffset);
Run Code Online (Sandbox Code Playgroud)

通过这样做,我使它免费一级异常,但日期可以,DateTime.Max - 1并在尝试添加偏移量时抛出异常.我正在寻找一种更好的方法,即在没有进行实际计算的情况下,最终值是否超出流量,以防止异常.

Scr*_*og1 8

如果不经常调用catch,你可以这样做:

try
{
    safeDate = dt.AddDays(days);
}
catch (ArgumentOutOfRangeException)
{
    safeDate = date;
}
Run Code Online (Sandbox Code Playgroud)

或者,

var maxDays = (DateTime.MaxValue - dt).TotalDays;
safeDate = (days <= maxDays) ? dt.AddDays(days) : dt;
Run Code Online (Sandbox Code Playgroud)

或者如果有负面日子:

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

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

如果你没有捕捉到try/catch版本大约快25%,如果你没有捕获大约1000倍.因此,如果您希望在每5000次使用中捕获超过1次,则使用第二个版本.


Raw*_*ing 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 为了*完全*安全,您应该真正检查适用文化的“System.Globalization.CultureInfo.DateTimeFormat.Calendar.MaxSupportedDateTime”。万一您没有使用儒略历。:) (2认同)