2009-09-09 12 views
12

Esiste un metodo per ottenere il codice 3 caratteri da System.TimeZoneInfo.Local ?come ottenere il nome breve TimeZoneInfo

ad es. EDT invece di Eastern Daylight time ecc.

+0

Va notato che non si può solo determinare la luce del giorno o meno da solo un fuso orario informazioni. Ad esempio, guardando il registro come suggerito, si può vedere che tutti i nomi includono solo "Standard" e non "Daylight". Pertanto non avrai una risposta precisa (che tenga conto della luce diurna) senza coinvolgere un DateTime da qualche parte. – user420667

risposta

9

Sfortunatamente, non c'è un modo semplice integrato di fare ciò che io conosca. Tuttavia, potresti mettere insieme qualcosa da te. Ecco un esempio:

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(); 

    } 

} 

Usa come segue:

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

Se avete bisogno di più conversioni si può solo collegarli dizionario Map.

TimeZoneInfo.Id sarà una stringa che corrisponde a una chiave specificata in [HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Fusi orari]. Se è possibile trovare un database online corrispondente, contenente gli stessi ID e le abbreviazioni, sarebbe possibile estrarre e importare rapidamente le coppie (con espressioni regolari, ad esempio) e rilasciarle nel dizionario Mappa.

+1

I possibili valori di 'Id' si trovano nel registro sotto' HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Fuso orario '(sono diversi dai nomi in http://www.timeanddate.com/library/abbreviazioni/fusi orari /) – dtb

+0

@dtb: Grazie. –

1

È possibile scrivere qualcosa di simile:

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

E l'assistente per esso:

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); 
    } 
} 
Problemi correlati