I have the following code in an ASP.NET MVC3 Controller:
public PartialViewResult GetCalendar(int? month, int? year)
{
var test = new DateTime((year.HasValue ? year.Value : 1), (month.HasValue ? month.Value : 1), 1);
return PartialView("Calendar", new DateTimeOffset(test));
}
My view model is DateTimeOffset?
What is the reason for the exception thrown?
The
DateTimeOffset
constructor first converts anyDateTime
that is not ofKind
'UTC' to the equivalent UTC time. It will then check whether the UTC-equivalentDateTime
falls outside of the bounds ofDateTimeOffset.MinValue
andDateTimeOffset.MaxValue
, and if it does, will throw anArgumentOutOfRangeException
similar to the one you are experiencing.Check the
DateTime.Kind
of the variabletest
that you are using, and if it is not 'UTC', work out if a conversion to UTC will make theDateTime
specified bytest
fall outside of those bounds - according to the MSDN documentation, theMinValue
andMaxValue
(in UTC) are '1/1/0001 12:00:00 AM +00:00' and '12/31/9999 11:59:59 PM +00:00' respectively.The docs (DateTimeOffset.MinValue) note that:
"Any DateTimeOffset value is converted to Coordinated Universal Time (UTC) before the method performs the comparison with MinValue. This means that a DateTimeOffset value whose date and time are close to the minimum range, but whose offset is positive, may throw an exception. For example, the value 1/1/0001 1:00:00 AM +02:00 is out of range because it is one hour earlier than MinValue when it is converted to UTC."
And also (DateTimeOffset.MaxValue):
"Any DateTimeOffset value is converted to Coordinated Universal Time (UTC) before the method compares it with MaxValue. This means that a DateTimeOffset value whose date and time are close to the maximum range, but whose offset is negative, may throw an exception. For example, the value 12/31/9999 11:00 PM -02:00 is out of range because it is one hour later than MaxValue when it is converted to UTC."
And as per the docs (DateTimeOffset Constructor), the offset that is applied to a non-UTC
Kind
is the "offset of the local system's current time zone".I just had this issue, introduced by the part of my team that's on a negative UTC zone...
What chamila_c posted is the real reason why this happens, but I needed a quick fix.
To "solve it" I basically created this extension:
you might also want to check against the MaxValue.