c# - ids - Llamada de excepción cuando TimeZoneInfo.ConvertTimeToUtc para ciertos valores de DateTime
timezoneinfo c# example (2)
Cuando ejecuto el código para este valor específico de dt, se lanza una excepción cuando llamo al Método ConvertTimeToUtc. Mi máquina local timeZoneId es "GMT Standard Time"
var tzi = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
var dt = new DateTime(1995, 4, 2, 2, 55, 0);
var t = TimeZoneInfo.ConvertTimeToUtc(dt, tzi);
La excepción es:
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
Sí, eso es absolutamente correcto. El 4 de abril de 1995 no existían las 2:55 a.m. en la Hora estándar central, ya que el reloj de pared se saltó de 2 a 3 a.m. debido a las transiciones de horario de verano . La excepción parece razonablemente clara al respecto. (El uso de "estándar" es un tanto complicado aquí; tendría más sentido llamarlo "Hora central", que incluiría "Hora estándar central" y "Hora de verano central", pero ese es un asunto diferente. Heck, preferiría Olson me identifica ...)
En otras ocasiones, la hora local puede ser ambigua: si el reloj se retrasa una hora (¡o más!), La hora local puede aparecer dos veces.
La pregunta es: ¿cómo quieres que se comporte tu código en esta situación?
Es un poco desafortunado que la excepción sea solo ArgumentException
: en Noda Time vamos a tener una excepción para este caso exacto, de modo que sea más fácil de detectar y detectar. (También tendremos algo como IsAmbiguous e IsSkipped para que pueda verificar sin detectar una excepción).
Pero el mensaje básico es que esto no es un error en el BCL, es deliberado.
Uno puede probar si el tiempo en cuestión no es válido usando
TimeZoneInfo.IsInvalidTime
o si es ambiguo usando
TimeZoneInfo.IsAmbiguousTime
Si es ambiguo, puede recuperarse una serie de veces que podrían aplicarse
TimeZoneInfo GetAmbiguousTimeOffsets
En el caso de una aplicación interactiva, se le puede pedir al usuario una aclaración.
El equipo de BCL escribió un buen blog sobre el tema.