C# 如何获取TimeZoneInfo短名称

C# 如何获取TimeZoneInfo短名称,c#,.net,vb.net,datetime,date,C#,.net,Vb.net,Datetime,Date,有什么方法可以从中获取3个字符的代码吗 System.TimeZoneInfo.Local ? e、 g.EDT而不是东部夏时制等。不幸的是,据我所知,没有一种简单的内置方法可以做到这一点。然而,你可以自己做一些事情。下面是一个例子: public static class TimeZoneInfoExtensions { public static string Abbreviation(this TimeZoneInfo Source) { var Map

有什么方法可以从中获取3个字符的代码吗 System.TimeZoneInfo.Local ?


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

不幸的是,据我所知,没有一种简单的内置方法可以做到这一点。然而,你可以自己做一些事情。下面是一个例子:

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

    }

}
如果需要更多转换,可以将它们插入地图字典


TimeZoneInfo.Id将是与[HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\TimeZones]中给定密钥匹配的字符串。如果您可以在线找到一个匹配的数据库,其中包含相同的ID和缩写,那么就可以快速提取和导入带有正则表达式的对,例如,并将它们放入地图字典中。

您可以编写如下内容:

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

Id的可能值可在HKEY\U LOCAL\U MACHINE\Software\Microsoft\Windows NT\CurrentVersion\timezone下的注册表中找到。它们与其中的名称不同。应该注意的是,不能仅通过时区信息来确定日光。例如,按照建议查看注册表,您可以看到所有名称仅包括Standard而不包括Daylight。因此,你不会有一个准确的答案,考虑到日光而不涉及某个地方的日期时间。
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);
    }
}