DateTime.Now 抛出了一个异常。

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,并且运行英国英语语言环境。
感谢任何帮助。

1
听起来像是一个有问题的Windows更新或者是.NET安装损坏了... - Noldorin
你能提供完整的堆栈跟踪吗?也许这与它有关?http://blog.brianhartsock.com/2009/02/21/systemargumentoutofrangeexception-at-systemwebhttpcachepolicyutcsetlastmodifieddatetime-utcdate/ - mellamokb
2
在这个问题中有相同的问题:http://stackoverflow.com/questions/8678681/argumentoutofrangeexception-on-cookiecontainer-getcookiesuri-uri,你能添加完整的堆栈跟踪吗? - Peter
1
如果TransitionTimeToDateTime中的转换尝试将DateTime加或减超过10,000年,那么就会抛出该异常。奇怪。 - hatchet - done with SOverflow
2
在代码中,会发生调整本地日期/时间以适应UTC时间的夏令时转换的情况。转换规则从注册表中读取,像这样的怪异问题通常是由于损坏的注册表引起的。注册表键为HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones。 - Hans Passant
显示剩余3条评论
1个回答

1

在Reflector中查看代码,您的异常是在TransitionTimeToDateTime中给定错误数据时内联的AddDays发生的。

AddDays的两个出现都处理transitionTime.DayOfWeek,其中transitionTimeGetDaylightTime中的rule.DaylightTransitionStartrule.DaylightTransitionEnd(以及time.DayOfWeek,但这始终是Mod 7)。

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

由于它很少发生,我认为这不是由于损坏的注册表(我希望每次都发生)。但是,为了进一步检查,可以查看MSDN文档TIME_ZONE_INFORMATION中描述的注册表条目。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接