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