2009-09-09 11 views
12

Gibt es eine Methode, um den 3 Zeichen Code von System.TimeZoneInfo.Local zu bekommen?Wie bekomme ich TimeZoneInfo Kurzname

z.B. EDT anstelle von Eastern Daylight time usw.

+0

Es sollte beachtet werden, dass man nicht nur das Tageslicht oder nicht von nur einer Zeitzone info bestimmen kann. Wenn Sie beispielsweise die Registrierung wie vorgeschlagen betrachten, können Sie sehen, dass alle Namen nur "Standard" und nicht "Tageslicht" enthalten. Daher haben Sie keine genaue Antwort (die Daylight berücksichtigt), ohne irgendwo eine DateTime einzubeziehen. – user420667

Antwort

9

Leider gibt es keine einfache integrierte Methode, dies zu tun, von der ich weiß. Sie könnten jedoch selbst etwas zusammenstellen. Hier ein Beispiel:

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

    } 

} 

Verwenden Sie wie folgt vor:

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

Wenn Sie mehr Conversions Sie brauchen nur sie in die Karte Wörterbuch stecken könnte.

TimeZoneInfo.Id wird eine Zeichenfolge sein, die einem bestimmten Schlüssel in [HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Time Zones] entspricht. Wenn Sie online eine passende Datenbank finden, die die gleichen IDs sowie die Abkürzungen enthält, wäre es möglich, die Paare (z. B. mit regulären Ausdrücken) schnell zu extrahieren und zu importieren und diese in das Map-Verzeichnis zu übernehmen.

+1

Die möglichen Werte für "Id" finden Sie in der Registrierung unter "HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ AktuelleVersion \ Zeitzone" (sie unterscheiden sich von den Namen in http://www.timeanddate.com/library)/Abkürzungen/Zeitzonen /) – dtb

+0

@dtb: Danke. –

1

Sie können so etwas wie schreiben:

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

Und die Helfer für sie:

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