我有一个带有两个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);
通过执行此操作,我将其免费提供一级异常,但日期可以为DateTime.Max - 1
,并且在尝试添加偏移量时会抛出异常。我正在寻找一种更好的方法,即在没有进行实际计算的情况下,最终值是否超出流量,以防止异常。
答案 0 :(得分:8)
如果不经常调用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's answer中的方法:CanAddDays(dt, days) ? dt.AddDays(days) : dt
如果你没有捕捉到try / catch版本大约快25%,如果你没有捕获大约1000倍。因此,如果您希望在每5000次使用中捕获超过1次,则使用第二个版本。
答案 1 :(得分:4)
您可以使用以下内容检查是否可以将给定天数添加到给定DateTime
而不会导致溢出:
bool CanAddDays(DateTime dt, int days)
{
double maxDaysToAdd = (DateTime.MaxValue - dt).TotalDays;
double minDaysToAdd = (DateTime.MinValue - dt).TotalDays;
return days <= maxDaysToAdd && days >= minDaysToAdd;
}
答案 2 :(得分: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
答案 3 :(得分: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);