Подтвердить что ты не робот

Вызов исключения, когда 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 
4b9b3361

Ответ 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