DateTime.Now正在抛出异常

Ger*_*Ven 10 .net datetime exception

我在运行几个网站的服务器上的DateTime.Now上抛出异常.在过去的3天里,这对我来说已经发生了两次.真奇怪.我想知道这是否已经开始与最新的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)
Run Code Online (Sandbox Code Playgroud)

发生这种情况的代码是if语句中的第一行:

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

虽然在那里有一个AddHours,并且异常是在讨论DateTime.Add,但我不认为它与AddHours有任何关系,但是由于你可以在堆栈跟踪中看到对Now的调用.

我所在的服务器正在运行Windows Server 2003,并且正在运行英语(英国)语言环境.

谢谢你的帮助.

Mar*_*urd 1

查看 Reflector 中的代码,当 .in-lineAddDays中给出错误数据时,会发生异常TransitionTimeToDateTime

AddDaysprocess transitionTime.DayOfWeekwhere transitionTimeisrule.DaylightTransitionStartrule.DaylightTransitionEndfrom都出现GetDaylightTime(以及time.DayOfWeek,但这始终是Mod 7)。

这似乎意味着偶尔会返回在哪个调用中生成的GetTimeZoneInformation错误数据。AdjustmentRuleGetOneYearLocalFromUtcGetCurrentOneYearLocal

因为这种情况很少发生,所以我不认为这是由于注册表损坏造成的(我希望它每次都会发生。),但为了帮助进一步检查 TIME_ZONE_INFORMATION 的 MSDN 文档,描述了检查的注册表项。

请注意,此信息不会被缓存,并且会在每次调用时检索DateTime.Now(这当然是正确的做法,因为 DST 可能刚刚更改,或者用户可能更改了当前时区)这是进行一些过早优化的好借口DateTime.UtcNow尽可能多地使用,并且.ToLocalTime仅在需要向用户显示时间时应用。