Время 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.