Время UTC, представленное при применении смещения, должно находиться между годом 0 и 10 000. Имя параметра: смещение
у меня есть следующий код в ASP.NET контроллер MVC3:
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));
}
моя модель представления DateTimeOffset?
в чем причина возникновения исключения?
2 ответов
на DateTimeOffset
конструктор сначала преобразует любой DateTime
, не Kind
' UTC ' к эквивалентному времени UTC. Затем он проверит, эквивалентен ли UTC DateTime
выходит за рамки DateTimeOffset.MinValue
и DateTimeOffset.MaxValue
, и если это произойдет, скинете ArgumentOutOfRangeException
похож на тот, который вы испытываете.
Регистрация DateTime.Kind
переменной test
что вы используете, и если это не "UTC", работать, если преобразование в UTC сделает DateTime
указано test
выйти за пределы этих границ-согласно документации MSDN,MinValue
и MaxValue
(в UTC) являются "1/1/0001 12:00:00 AM +00:00" и "12/31/9999 11:59:59 PM +00:00" соответственно.
документы (DateTimeOffset.Параметр minvalue) обратите внимание, что:
" любое значение DateTimeOffset преобразуется в координированное универсальное время (UTC), прежде чем метод выполняет сравнение с MinValue. Это означает, что значение DateTimeOffset-дата и время близко к минимальный диапазон, но смещение которого положительное, может вызвать исключение. Например, значение 1/1/0001 1: 00:00 AM +02: 00 находится вне диапазона, поскольку оно на час раньше, чем значение MinValue при преобразовании в UTC."
и (DateTimeOffset.Максвеллову):
" любое значение DateTimeOffset преобразуется в координированное универсальное время (UTC), прежде чем метод сравнивает его с MaxValue. Это означает, что значение DateTimeOffset-дата и время близко к максимальный диапазон, но смещение которого отрицательно, может вызвать исключение. Например, значение 12/31/9999 11:00 PM -02: 00 находится вне диапазона, поскольку оно на час позже MaxValue при преобразовании в UTC."
и согласно документам (Конструктор DateTimeOffset), смещение, которое применяется к не-UTC Kind
- "смещение текущего часового пояса локальной системы".
У меня только что была эта проблема, введенная частью моей команды, которая находится в отрицательной зоне UTC...
то, что chamila_c опубликовал, является реальной причиной этого, но мне нужно было быстро исправить.
чтобы "решить это", я в основном создал это расширение:
public static class DateTimeExtensions
{
public static DateTimeOffset ToDateTimeOffset(this DateTime dateTime)
{
return dateTime.ToUniversalTime() <= DateTimeOffset.MinValue.UtcDateTime
? DateTimeOffset.MinValue
: new DateTimeOffset(dateTime);
}
}
вы также можете проверить значение MaxValue.