7

2つのパラメーターを受け取る関数がありDateTime、これらの日付に個別のオフセットを追加する必要があります。日付に日を追加DateTimeする関数があり、が。より小さいか大きい場合は例外をスローすることを知っています。AddDaysDateTimeMinValueMaxValue

ここで、次の日数をaに加算/減算すると、オーバーフローDateTime/アンダーフローが発生する可能性があるかどうかを安全に確認したいと思います。

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

これを行うことで、1レベルの例外を無料にしますが、日付は可能で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;

または、ローリングの答えの方法を使用してください:CanAddDays(dt, days) ? dt.AddDays(days) : dt

try/catch バージョンは、キャッチしない場合は約 25% 速く、キャッチすると約 1000 倍遅くなります。そのため、5000 回の使用ごとに約 1 回以上キャッチすると予想される場合は、2 番目のバージョンを使用してください。

于 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 に答える