2012-02-10 13 views
11

Tengo un problema extraño que parece que no puedo resolver. Cuando llamo al TimeZoneInfo.GetSystemTimeZones en mi máquina Win 7 x64 obtengo 101 resultados. Cuando llamo al TimeZoneInfo.FindSystemTimeZoneById en cada uno de estos y paso el atributo StandardName del objeto TimeZoneInfo, 3 de ellos arrojan TimeZoneNotFoundException.¿Por qué algunas zonas horarias devueltas por GetSystemTimeZones no encontradas por FindSystemTimeZoneById?

He aquí una muestra:

var tzs = TimeZoneInfo.GetSystemTimeZones(); 

foreach (var timeZoneInfo in tzs.OrderBy(t => t.BaseUtcOffset)) 
{ 
    try 
    { 
    TimeZoneInfo.FindSystemTimeZoneById(timeZoneInfo.StandardName); 
    } 
    catch (TimeZoneNotFoundException) 
    { 
    Console.WriteLine(timeZoneInfo.DisplayName + "|" + timeZoneInfo.StandardName + "|" + timeZoneInfo.BaseUtcOffset); 
    } 
} 

Console.ReadLine(); 

Esto tiene problemas para encontrar "tiempo universal coordinado", "Jerusalén Standard Time" y "Península de Malaca hora estándar". Tomando un caso como Malasia, que se puede ver una entrada para que cuando miro a las zonas horarias disponibles en mi configuración regional, a pesar de que está mostrando el atributo DisplayName en lugar de la StandardName:

Time zones

Sin embargo, no puedo no lo puede ver con ninguno de los dos nombres cuando navega por el registro en HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Time Zones

¿Qué está pasando aquí? ¿Por qué no se puede cargar la zona horaria de Malasia por su nombre?

Por favor, no hay implementaciones alternativas de zonas horarias utilizando otras bibliotecas - Solo quiero llegar al fondo de este tema por ahora. ¡Gracias!

Respuesta

15

TimeZoneInfo.FindSystemTimeZoneById método acepta la identificación de zona horaria como parámetro. Estás usando timeZoneInfo.StandardName en su lugar.

Parece que para estas 3 zonas los valores para las propiedades TimeZoneInfo.StandardName y TimeZoneInfo.Id son diferentes. Usando esto:

TimeZoneInfo.FindSystemTimeZoneById(timeZoneInfo.Id); 

resolverá el problema.

+1

Tan extraño como mi código se ve en retrospectiva (es decir, omitiendo lo dolorosamente obvio), también es extraño que solo 3 de 101 TZ tengan una ID diferente al nombre estándar. Resulta que Malasia es "hora estándar de Singapur". ¡Aquí tienes! –

+0

@alex ¿Tenemos TimeZoneInfo.ID como una propiedad válida? –

Cuestiones relacionadas