Вызов исключения, когда TimeZoneInfo. ConvertTimeToUtc для определенных значений DateTime

Когда я выполняю код для этого определенного значения 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 
23
задан B4ndt 10 March 2010 в 11:28
поделиться

1 ответ

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

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

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

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

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

25
ответ дан 29 November 2019 в 01:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: