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

В чем причина исключения?

Ответ 1

Конструктор 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.MaxValue):

"Любое значение DateTimeOffset преобразуется в координированное универсальное время (UTC), прежде чем метод сравнивает его с MaxValue. Это означает, что значение DateTimeOffset, дата и время которого близки к максимальному диапазону, но смещение которого отрицательно, может Например, значение 12/31/9999 11:00 PM -02: 00 находится за пределами допустимого диапазона, поскольку на час после MaxValue оно преобразуется в UTC.

И согласно документам (DateTimeOffset Constructor), смещение, которое применяется к не-UTC Kind, является "смещением текущий часовой пояс локальной системы".

Ответ 2

У меня просто была эта проблема, представленная той частью моей команды, что в отрицательной зоне 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.