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.
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.
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.
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
@dtb: Dziękuję. –
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);
}
}
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