Преобразование DateTime.MinValue в DateTimeOffset - PullRequest
6 голосов
/ 03 августа 2011

Я пытаюсь преобразовать DateTime.MinValue в значение DateTimeOffset, но получаю исключение ArgumentOutOfRange.

Я просматривал статью MSDN о неявном преобразовании DateTime в DateTimeOffset и в разделе «Исключение» говорится, что я получу это исключение ArgumentOutOfRange, когда;

... Дата и время всемирного координированного времени (UTC), возникающие в результате применения смещения, на раньше , чем MinValue....

Почему следующий код генерирует исключение:

DateTime test = DateTime.MinValue;
DateTimeOffset dto = test;

Это просто из-за моего часового пояса?Я нахожусь в GMT +8, но мое понимание приведенного выше кода заключается в том, что тест создается с неопределенным видом.

Я работаю над этой проблемой, просто проверяя MinValue моего DateTime, и если да, то вместо этого использую DateTimeOffset.MinValue.

Мне просто любопытно, почему мой неопределенный объект типа DateTime вызывает ошибку.

1 Ответ

6 голосов
/ 03 августа 2011

Если вы находитесь в GMT + 8, то местное время DateTime.MinValue соответствует UTC времени раньше, чем DateTime.MinValue, отсюда исключение. Из документации, на которую вы ссылались:

Если значением свойства DateTime.Kind является DateTimeKind.Local или DateTimeKind.Unspecified, дата и время объекта DateTimeOffset устанавливаются равными dateTime, а его свойство Offset устанавливается равным смещению текущего значения локальной системы. часовой пояс.

Логично, что у вас будет DateTime, равный MinValue, с Offset, равным 8 часам, но это означает, что дата / время в формате UTC, полученные в результате применения смещения, раньше, чем может быть представлена.

(Не забывайте, что вы добавляете смещение к UTC, чтобы получить местное время, или вычитаете из местного времени, чтобы получить UTC. В Noda Time мы применяем это, используя типы для каждого из Offset, LocalInstant и Instant, и разрешаем вам только выполнять соответствующую операцию ...)

...