C# 在C中安全地向DateTime添加/减去天数#

C# 在C中安全地向DateTime添加/减去天数#,c#,datetime,C#,Datetime,我有一个函数,它接受两个DateTime参数,我必须为这些日期添加单独的偏移量。我知道DateTime有一个AddDays函数来向日期添加天数,如果DateTime小于MinValue或大于MaxValue,它会抛出一个异常 现在,我想做一个安全的检查,在日期时间中添加/减去以下天数是否会导致流量过大/不足 safeStartDate = (startDate == DateTime.MinValue || startDate == DateTime.MaxValue) ? startDate

我有一个函数,它接受两个
DateTime
参数,我必须为这些日期添加单独的偏移量。我知道
DateTime
有一个
AddDays
函数来向日期添加天数,如果
DateTime
小于
MinValue
或大于
MaxValue
,它会抛出一个异常

现在,我想做一个安全的检查,在
日期时间中添加/减去以下天数是否会导致流量过大/不足

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

通过这样做,我使其无一级异常,但date可以是
DateTime.Max-1
,当尝试添加偏移量时,它会抛出一个异常。为了防止异常,我正在寻找一种更好的方法来确定最终值是否超过/低于实际计算值。如果不经常调用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;

safeDate=(days我想你在找这样的东西

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        

您可以使用以下命令检查是否可以在不导致溢出的情况下将给定天数添加到给定的
DateTime

bool CanAddDays(DateTime dt, int days)
{
    double maxDaysToAdd = (DateTime.MaxValue - dt).TotalDays;
    double minDaysToAdd = (DateTime.MinValue - dt).TotalDays;
    return days <= maxDaysToAdd && days >= minDaysToAdd;
}
boolcanadddays(日期时间dt,整数天)
{
double maxDaysToAdd=(DateTime.MaxValue-dt).TotalDays;
double minDaysToAdd=(DateTime.MinValue-dt).TotalDays;
返回天数=minDaysToAdd;
}

<代码> > p>您可以考虑以下方法:

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.MaxValue-date并将其与您的offsetyeah进行比较,溢出非常频繁,这就是为什么我的第一个偏好是避免try catch@RaviGupta,你查过我的答案了吗?它没有使用
try{}catch{}
approach,从我的测试来看,10000次迭代的速度比它快500倍。如果经常调用它会有什么问题?但是经常调用它会有什么问题。Try/Catch很昂贵;如果大量调用它会很慢。而且我有2个datetime,所以我必须将两个单独的Try/Catch背对背放置。或者创建一个方法,然后为每个方法调用。This将是目前为止最简单的方法。它还意味着您不必担心实际上应该使用System.Globalization.CultureInfo.DateTimeFormat.Calendar.MaxSupportedDateTime而不是DateTime.MaxValue,这取决于当前的区域性。为了完全安全,您应该真正检查
System.Globalization.CultureInfo.DateTimeFormat.Calendar.MaxSupportedDateTime
用于适用的区域性。在不太可能的情况下,您没有使用朱利安日历。。。我相信你的话:pI不是100%,但我认为他们应该是
=
。(可能不是真的,因为它们是双倍的)@Scroog你是对的,如果间隔是一个整数天,那么添加所说的整数应该是合法的。我验证了源代码(.NET和.NET Core),这与.NET本身在将timespan添加到datetime时在内部所做的差不多+1.
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);