如何获取TimeZoneInfo的简称

时间:2009-09-09 22:49:22

标签: c# .net vb.net datetime date

是否有任何方法可以获取3个char代码 System.TimeZoneInfo.Local ?

e.g。 EDT而不是东部夏令时等。

2 个答案:

答案 0 :(得分:9)

不幸的是,我知道没有简单的内置方式。但是,你可以自己把东西放在一起。这是一个例子:

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

    }

}

使用如下:

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

如果您需要更多转换,只需将它们插入地图字典即可。

TimeZoneInfo.Id将是[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Time Zones]中与给定键匹配的字符串。如果您可以在线找到匹配的数据库,包含相同的ID和缩写,则可以快速提取和导入对(例如,使用正则表达式)并将其放入Map字典中。

答案 1 :(得分:3)

你可以这样写:

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

它的帮手:

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