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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With