Вызов исключения, когда TimeZoneInfo.ConvertTimeToUtc для определенных значений DateTime - PullRequest
23 голосов
/ 10 марта 2010

Когда я запускаю код для этого конкретного значения dt, возникает исключение при вызове метода ConvertTimeToUtc. Моя локальная машина timeZoneId - это стандартное время по Гринвичу

var tzi = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
var dt = new DateTime(1995, 4, 2, 2, 55, 0);
var t = TimeZoneInfo.ConvertTimeToUtc(dt, tzi);

Исключение составляет:

System.ArgumentException was unhandled
Message="The supplied DateTime represents an invalid time.  For example, when the clock is adjusted forward, any time in the period that is skipped is invalid.\r\nParameter 

Ответы [ 2 ]

25 голосов
/ 10 марта 2010

Да, это абсолютно верно. 2:55 утра по центральному стандартному времени 4 апреля 1995 года не существовало, так как настенные часы пропустили с 2:00 до 3:00 из-за перехода на летнее время . Исключение кажется достаточно ясным по этому поводу. (Использование «стандарта» здесь несколько сложно; было бы более разумно назвать его «Центральное время», которое будет включать «Центральное стандартное время» и «Центральное летнее время», но это другой вопрос. Черт, я бы предпочел Олсон идентифицирует себя ...)

В другое время местное время может быть неоднозначным - если часы идут назад час (или больше!), То местное время может появляться дважды.

Вопрос: как вы хотите, чтобы ваш код вел себя в такой ситуации?

К сожалению, исключение составляет всего лишь ArgumentException - в Время Нода у нас будет исключение для этого точного случая, чтобы его было легче обнаружить и поймать. (У нас также будет что-то вроде IsAmbiguous и IsSkipped, чтобы вы могли проверять, не перехватывая исключение.)

Но основное сообщение заключается в том, что это не ошибка в BCL - это преднамеренное.

18 голосов
/ 24 апреля 2012

Можно проверить, является ли рассматриваемое время недействительным, используя

TimeZoneInfo.IsInvalidTime

или если это неоднозначно, используя

TimeZoneInfo.IsAmbiguousTime

Если это неоднозначно, массив значений, которые могут применяться, можно извлечь из

TimeZoneInfo GetAmbiguousTimeOffsets

В случае интерактивного приложения пользователю может быть предложено дать разъяснения.

Команда BCL написала хороший блог на эту тему

http://blogs.msdn.com/b/bclteam/archive/2007/06/11/system-timezoneinfo-working-with-ambiguous-and-invalid-points-in-time-josh-free.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...