10

我在运行几个网站的服务器上的 DateTime.Now 上抛出异常。在过去的 3 天里,这在我身上发生了两次。真的很奇怪。我想知道最新的 Windows 更新是否已经开始发生这种情况,以及你们中是否有人看到类似的行为出现。

抛出的异常是:

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 中的代码,当AddDaysTransitionTimeToDateTime.

AddDays过程transitionTime.DayOfWeekwhere transitionTimeisrule.DaylightTransitionStartrule.DaylightTransitionEndfrom的两次出现GetDaylightTime(以及time.DayOfWeek,但始终是Mod 7)。

这似乎意味着GetTimeZoneInformation偶尔会返回错误数据,其中AdjustmentRule生成的GetOneYearLocalFromUtc调用GetCurrentOneYearLocal

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

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

于 2012-05-21T15:12:19.383 回答