Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DateTime.Now is throwing an exception

I am getting an exception thrown on DateTime.Now on our server running a few websites. This has now happened twice to me in the past 3 days. Really strange. I am wondering whether this has started to happen with the latest Windows Update and if any of you have seen similar behaviour coming in.

The exception thrown is:

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)

The code where this happens is the first line in the if-statement:

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

Although there is an AddHours in there and the exception is talking about DateTime.Add, I don't believe it has anything to do with the AddHours, but is caused by the call to Now as you can see in the stack trace.

The server I am on is running Windows Server 2003, and is running the English (United Kingdom) locale.

Thanks for any help.

like image 203
Gerard van de Ven Avatar asked Apr 25 '12 21:04

Gerard van de Ven


1 Answers

Reviewing the code in Reflector, your exception is occurring when an in-lined AddDays is given bad data in TransitionTimeToDateTime.

Both occurrences of AddDays process transitionTime.DayOfWeek where transitionTime is rule.DaylightTransitionStart or rule.DaylightTransitionEnd from GetDaylightTime (as well as time.DayOfWeek, but this is always Mod 7).

This seems to mean GetTimeZoneInformation is occasionally returning bad data where the AdjustmentRule is generated in GetOneYearLocalFromUtc which calls GetCurrentOneYearLocal.

Because it is happening rarely, I don't think it will be due to a corrupt registry (I'd expect it to happen every time.), but to help further checking the MSDN documentation for TIME_ZONE_INFORMATION describes the registry entries to check.

Note this information is not cached and is retrieved every time you call DateTime.Now, (which is of course the correct thing to do as DST could have just changed, or the user could have changed the current time zone) a good excuse for some premature optimisation by using DateTime.UtcNow as much as possible and applying .ToLocalTime only when you need to display the time to the user.

like image 165
Mark Hurd Avatar answered Oct 19 '22 04:10

Mark Hurd