Вызов исключения, когда TimeZoneInfo.ConvertTimeToUtc для определенных значений DateTime
Когда я запускаю код для этого конкретного значения dt, возникает исключение, когда я вызываю метод ConvertTimeToUtc.
Мое местное время MachineZoneId - "Стандартное время по умолчанию"
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
Ответы
Ответ 1
Да, это абсолютно правильно. 2:55 утра не было в Central Standard Time 4 апреля 1995 года, поскольку настенные часы пропущены с 2 до 3 часов из-за перехода на летнее время. Исключение кажется достаточно понятным. (Использование "стандарта" здесь несколько сложно, и было бы разумнее называть его "Центральное время", которое включало бы "Центральное стандартное время" и "Центральное дневное время", но это другое дело. Черт, я бы предпочел Идентификаторы Olson...)
В другое время местное время может быть неоднозначным - если часы возвращаются через час (или больше!), тогда местное время может происходить дважды.
Вопрос: как вы хотите, чтобы ваш код действовал в этой ситуации?
Несколько досадно, что исключение - это просто ArgumentException
- в Noda Time, у нас будет исключение для этого точного случая, так что это легче обнаружить и поймать. (У нас также будет что-то вроде IsAmbiguous и IsSkipped, чтобы вы могли проверить, не перехватывая исключение.)
Но основное сообщение состоит в том, что это не ошибка в BCL - она преднамеренно.
Ответ 2
Можно проверить, недействительно ли указанное время с помощью
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