2009-09-09 16 views
12

¿Hay algún método para obtener el código de 3 caracteres de System.TimeZoneInfo.Local ?cómo obtener el nombre abreviado de TimeZoneInfo

p. Ej. EDT en lugar de horario de verano del Este, etc.

+0

Cabe señalar que no se puede determinar simplemente la luz del día o no de la información sólo una zona horaria. Por ejemplo, mirando el registro como se sugiere, uno puede ver que todos los nombres solo incluyen "Estándar" y no "Luz del día". Por lo tanto, no tendrá una respuesta precisa (que tenga en cuenta la Luz del día) sin incluir un DateTime en algún lugar. – user420667

Respuesta

9

Desafortunadamente, no hay una forma fácil de hacerlo, que yo sepa. Sin embargo, podrías armar algo tú mismo. He aquí un ejemplo:

public static class TimeZoneInfoExtensions { 

     public static string Abbreviation(this TimeZoneInfo Source) { 

     var Map = new Dictionary<string, string>() 
     { 
      {"eastern standard time","est"}, 
      {"mountain standard time","mst"}, 
      {"central standard time","cst"}, 
      {"pacific standard time","pst"} 
      //etc... 
     }; 

     return Map[Source.Id.ToLower()].ToUpper(); 

    } 

} 

uso de la siguiente manera:

string CurrentTimeZoneAbbreviation = System.TimeZoneInfo.Local.Abbreviation(); 

Si usted necesita más conversiones que sólo les podía conectar en el diccionario del mapa.

TimeZoneInfo.Id será una cadena que coincida con una clave determinada en [HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Time Zones]. Si puede encontrar una base de datos coincidente en línea, que contenga los mismos ID y las abreviaturas, sería posible extraer e importar rápidamente los pares (con expresiones regulares, por ejemplo) y soltarlos en el diccionario de mapas.

+1

Los valores posibles para 'Id' se pueden encontrar en el registro en' HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Time Zone' (son diferentes de los nombres en http://www.timeanddate.com/library/abreviaturas/zonas horarias /) – dtb

+0

@dtb: Gracias. –

1

Puede escribir algo como:

var abbr = System.TimeZoneInfo.Local.TimeZoneAbbr(); 

y el ayudante para ello:

public static class ConvertionHelper 
{ 
    public static String TimeZoneAbbr(this TimeZoneInfo zone) 
    { 
     var zoneName = zone.Id;/* zone.IsDaylightSavingTime(DateTime.UtcNow) 
      ? zone.DaylightName 
      : zone.StandardName;*/ 
     var zoneAbbr = zoneName.CapitalLetters(); 
     return zoneAbbr; 
    } 

    public static String CapitalLetters(this String str) 
    { 
     return str.Transform(c => Char.IsUpper(c) 
      ? c.ToString(CultureInfo.InvariantCulture) 
      : null); 
    } 

    private static String Transform(this String src, Func<Char, String> transformation) 
    { 
     if (String.IsNullOrWhiteSpace(src)) 
     { 
      return src; 
     } 

     var result = src.Select(transformation) 
      .Where(res => res != null) 
      .ToList(); 

     return String.Join("", result); 
    } 
} 
Cuestiones relacionadas