2009-09-09 14 views
12

Czy istnieje metoda uzyskania 3 kodów char z System.TimeZoneInfo.Local ?Skąd wziąć krótką nazwę TimeZoneInfo?

np. EDT zamiast Eastern Daylight itp.

+0

Należy zauważyć, że nie można ustalić jedynie światło dzienne lub nie z tylko o czasowej. Na przykład, patrząc na rejestr jako sugerowany, widać, że wszystkie nazwy zawierają tylko "Standard", a nie "Światło dzienne". Dlatego nie będziesz mieć dokładnej odpowiedzi (uwzględniającej światło dzienne) bez angażowania gdzieś Daty. – user420667

Odpowiedz

9

Niestety, nie ma łatwego wbudowanego sposobu robienia tego, co wiem. Jednak możesz sam coś połączyć. Oto przykład:

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

    } 

} 

Zastosowanie następująco:

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

Jeśli potrzebujesz więcej konwersji można po prostu podłącz je do słownika Mapa.

TimeZoneInfo.Id będzie ciągiem pasującym do danego klucza w [HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Time Zones]. Jeśli znajdziesz pasującą bazę danych online, zawierającą te same identyfikatory, a także skróty, możliwe będzie szybkie wyodrębnienie i zaimportowanie par (na przykład za pomocą wyrażeń regularnych) i umieszczenie ich w słowniku mapy.

+1

Możliwe wartości dla "Id" można znaleźć w rejestrze w "HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Time Zone" (różnią się od nazw w http://www.timeanddate.com/library/skróty/strefy czasowe /) – dtb

+0

@dtb: Dziękuję. –

1

można napisać coś takiego:

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

a pomocnika do niego:

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); 
    } 
} 
Powiązane problemy