10

いくつかの Web サイトを実行しているサーバーで、DateTime.Now で例外がスローされます。これは、過去3日間で2回発生しました。本当に奇妙です。これが最新の Windows Update で発生し始めたのかどうか、また、同様の動作が発生しているのを見た人がいるかどうか疑問に思っています.

スローされる例外は次のとおりです。

BASE EXCEPTION:
  TYPE: System.ArgumentOutOfRangeException
  MESSAGE: Value to add was out of range.
Parameter name: value
  STACK TRACE:
   at System.DateTime.Add(Double value, Int32 scale)
   at System.TimeZoneInfo.TransitionTimeToDateTime(Int32 year, TransitionTime transitionTime)
   at System.TimeZoneInfo.GetDaylightTime(Int32 year, AdjustmentRule rule)
   at System.TimeZoneInfo.GetIsDaylightSavingsFromUtc(DateTime time, Int32 Year, TimeSpan utc, AdjustmentRule rule, Boolean& isAmbiguousLocalDst)
   at System.TimeZoneInfo.GetDateTimeNowUtcOffsetFromUtc(DateTime time, Boolean& isAmbiguousLocalDst)
   at System.DateTime.get_Now()
   at (my code).FrontEnd.FrontEndPage.Page_Load(Object sender, EventArgs e) in (my code file)\code\presentation\FrontEndPage.cs:line 118
   at (my code).purchase.Page_Load(Object sender, EventArgs e) in (my code file)\purchase.aspx.cs:line 94
   at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
   at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   at System.Web.UI.Control.OnLoad(EventArgs e)
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

これが発生するコードは、if ステートメントの最初の行です。

HttpCookie loggedIn = Request.Cookies[Config.Instance.LoggedInCookieName];
if (loggedIn != null)
{
    loggedIn.Expires = DateTime.Now.AddHours(4);
    Response.Cookies.Add(loggedIn);
}

そこに AddHours があり、例外は DateTime.Add に関するものですが、AddHours とは何の関係もないと思いますが、スタック トレースでわかるように Now の呼び出しが原因です。

私が使用しているサーバーは Windows Server 2003 を実行しており、英語 (英国) ロケールを実行しています。

助けてくれてありがとう。

4

1 に答える 1

1

Reflectorのコードを確認すると、インラインにAddDays不正なデータが指定された場合に例外が発生しTransitionTimeToDateTimeます。

AddDaysプロセスの両方の発生transitionTime.DayOfWeek場所transitionTimerule.DaylightTransitionStart、またはrule.DaylightTransitionEndからですGetDaylightTime(およびtime.DayOfWeek、ですが、これは常にMod 7です)。

これは、が生成された場所で、呼び出しGetTimeZoneInformationで不良データが返されることがあることを意味しているようです。AdjustmentRuleGetOneYearLocalFromUtcGetCurrentOneYearLocal

まれにしか発生しないため、レジストリが破損していることが原因ではないと思います(毎回発生すると思います)が、MSDNのドキュメントでTIME_ZONE_INFORMATIONをさらに確認するために、確認するレジストリエントリについて説明しています。

この情報はキャッシュされず、呼び出すたびに取得されることに注意してくださいDateTime.Now(もちろん、DSTが変更された可能性があるため、またはユーザーが現在のタイムゾーンを変更した可能性があるため、これは正しいことです)。DateTime.UtcNow可能な限り使用.ToLocalTimeし、ユーザーに時間を表示する必要がある場合にのみ適用します。

于 2012-05-21T15:12:19.383 に答える