代码之家  ›  专栏  ›  技术社区  ›  iLemming

时区缩写

  •  71
  • iLemming  · 技术社区  · 13 年前

    TimeZoneInfo 不提供给定时区的缩写或短名称。唯一好的方法是有一本词典,可以将缩写映射到 Timezone.id , StandardName DaylightName 属性。然而,我搜索的所有缩写列表来源都有不同的时区名称,即与Windows中的名称不同。

    如何在.NET中向用户显示非全名、id或任何其他名称?我不想要UtcOffset,而是时区缩写-太平洋标准时间,UTC-环球标准时间,EST-东方标准时间等等。有没有与C#兼容的列表或数据库,其中包含所有可能的时区及其缩写,与 TimeZoneInfo.GetSystemTimeZones() 给你?

    9 回复  |  直到 11 年前
        1
  •  91
  •   Mmm Matt Johnson-Pint    4 年前

    更新的答案

    我的原始回复如下,并且仍然有效。然而,现在有一种更简单的方法,使用 the TimeZoneNames library .安装后 from Nuget ,您可以执行以下操作:

    string tzid = theTimeZoneInfo.Id;                // example: "Eastern Standard time"
    string lang = CultureInfo.CurrentCulture.Name;   // example: "en-US"
    var abbreviations = TZNames.GetAbbreviationsForTimeZone(tzid, lang);
    

    生成的对象将具有类似于以下内容的属性:

    abbreviations.Generic == "ET"
    abbreviations.Standard == "EST"
    abbreviations.Daylight == "EDT"
    

    您也可以使用这个库来获取时区的完全本地化名称。该库使用CLDR数据的嵌入式自包含副本。

    原始答案

    正如其他人提到的那样,时区缩写是模棱两可的。但如果你真的想要一个显示,你需要一个IANA/Olson时区数据库。

    您可以从Windows时区转到IANA/Olson时区,也可以转到其他方向。但请注意,对于任何给定的Windows区域,都可能有多个IANA/Olson区域。这些映射在CLDR中进行维护 here .

    NodaTime 同时具有数据库和映射。你可以从.Net上访问 DateTime DateTimeOffset 用一个 TimeZoneInfo ,到NodaTime Instant DateTimeZone 。从那里,你可以得到缩写名称。

    // starting with a .Net TimeZoneInfo
    var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
    
    // You need to resolve to a specific instant in time - a noda Instant
    // For illustrative purposes, I'll start from a regular .Net UTC DateTime
    var dateTime = DateTime.UtcNow;
    var instant = Instant.FromDateTimeUtc(dateTime);
    
    // note that if we really wanted to just get the current instant,
    // it's better and easier to use the following:
    // var instant = SystemClock.Instance.Now;
    
    
    // Now let's map the Windows time zone to an IANA/Olson time zone,
    // using the CLDR mappings embedded in NodaTime.  This will use
    // the *primary* mapping from the CLDR - that is, the ones marked
    // as "territory 001".
    
    // we need the NodaTime tzdb source.  In NodaTime 1.1.0+:
    var tzdbSource = TzdbDateTimeZoneSource.Default;
    
    // in previous NodaTime releases:
    // var tzdbSource = new TzdbDateTimeZoneSource("NodaTime.TimeZones.Tzdb");
    
    // map to the appropriate IANA/Olson tzid
    var tzid = tzdbSource.MapTimeZoneId(timeZoneInfo);
            
    // get a DateTimeZone from that id
    var dateTimeZone = DateTimeZoneProviders.Tzdb[tzid];
    
    
    // Finally, let's figure out what the abbreviation is
    // for the instant and zone we have.
    
    // now get a ZoneInterval for the zone and the instant
    var zoneInterval = dateTimeZone.GetZoneInterval(instant);
    
    // finally, you can get the correct time zone abbreviation
    var abbreviation = zoneInterval.Name;
    
    // abbreviation will be either PST or PDT depending
    // on what instant was provided
    Debug.WriteLine(abbreviation);
    
        2
  •  15
  •   user474407 user474407    13 年前

    这是一个棘手的要求,你能做的最好的事情就是获得你选择的列表,并创建一个扩展/帮助方法来获得给定TimeZoneInfo的缩写。

    一旦开始的地方在 http://www.timeanddate.com/library/abbreviations/timezones/ 它有一个列表版本,涵盖了我所知道的区域。

    问题是在给定时区存在多个缩写的情况下选择合适的缩写。例如 离合器 可以表示为 离合器 西欧时间 WEZ(《西欧日报》) 西撒哈拉标准时间 .

    您可能希望与您的利益相关者就您将在给定的选择中遵循的命名约定达成一致。

        3
  •  14
  •   STLDev    12 年前

    您的问题并没有说明您的应用程序必须在哪些时区内运行,但在我的特定情况下,我只需要关注美国时区和UTC。

    美国时区的缩写始终是时区名称中每个单词的第一个字符。例如,“山地标准时间”的缩写是“MST”,而“东部夏令时”的缩写则是“EDT”。

    如果你有类似的要求,你可以很容易地直接从当地时区的名称中推导出当地时区的时区缩写,如下所示(注意:这里我是根据当前的日期和时间来确定正确的名称):

    string timeZoneName = TimeZone.CurrentTimeZone.IsDaylightSavingTime(DateTime.Now)
                              ? TimeZone.CurrentTimeZone.DaylightName 
                              : TimeZone.CurrentTimeZone.StandardName;
    
    string timeZoneAbbrev = GetTzAbbreviation(timeZoneName);
    

    的代码 GetTzInitials() 函数非常简单。值得一提的是,一些时区可能设置为墨西哥或加拿大,这些时区的时区名称将在括号中加上国家名称,例如“太平洋标准时间(墨西哥)”。为了处理这个问题,任何带括号的数据都会直接传回。上面返回的缩写将是“PST(墨西哥)”,这对我有效。

    string GetTzAbbreviation(string timeZoneName) {
        string output = string.Empty;
    
        string[] timeZoneWords = timeZoneName.Split(' ');
        foreach (string timeZoneWord in timeZoneWords) {
            if (timeZoneWord[0] != '(') {
                output += timeZoneWord[0];
            } else {
                output += timeZoneWord;
            }
        }
        return output;
    }
    
        4
  •  5
  •   BrandonLWhite    13 年前

    下面是另一个使用NodaTime的片段:

    NodaTime.ZonedDateTime hereAndNow = NodaTime.SystemClock.Instance.Now.InZone(
        NodaTime.DateTimeZoneProviders.Tzdb.GetSystemDefault());
    
    System.TimeSpan zoneOffset = hereAndNow.ToDateTimeOffset().Offset;
    
    string sTimeDisplay = string.Format("{0:G} {1} (UTC{2}{3:hh\\:mm} {4})", 
        hereAndNow.ToDateTimeOffset(), 
        hereAndNow.Zone.GetZoneInterval(hereAndNow.ToInstant()).Name, 
        zoneOffset < TimeSpan.Zero ? "-" : "+", 
        zoneOffset, 
        hereAndNow.Zone.Id);
    

    在我的系统中,这会产生:“2013年4月11日下午5:03:23 CDT(UTC-05:00美国/芝加哥)”

    (感谢Matt Johnson的回答,因为这个缩写存在于TimeZoneInterval中)

    如果NodaTime.ZonedDateTime有一个GetZoneInterval方法会更容易,但也许我遗漏了一些东西。

        5
  •  4
  •   Gandalf458    10 年前

    这对任何在iOS或Android上使用Xamarin的人都很有帮助,因为根据文档“显示名称基于Windows操作系统安装的区域性进行本地化”。当在中央时区使用此功能时,对于DateTime“2016-09-01 12:00:00 GMT”,此函数会返回“CDT”,这正是我遇到此问题时所需要的。

    public static string GetTimeZoneAbbreviation(DateTime time)
    {
        string timeZoneAbbr;
        if(time.IsDaylightSavingTime() == true)
        {
            timeZoneAbbr = TimeZoneInfo.Local.DaylightName;
        }
        else
        {
            timeZoneAbbr = TimeZoneInfo.Local.StandardName;
        }
    
        return timeZoneAbbr;
    }
    
        6
  •  4
  •   Adam Hey    7 年前

    我将所有日期存储在UTC中,并且经常必须以本地时间显示,所以我创建了一个扩展方法 ToAbbreviation()

        public static string ToAbbreviation(this TimeZone theTimeZone)
        {
    
            string timeZoneString = theTimeZone.StandardName;
            string result = string.Concat(System.Text.RegularExpressions.Regex
               .Matches(timeZoneString, "[A-Z]")
               .OfType<System.Text.RegularExpressions.Match>()
               .Select(match => match.Value));
    
            return result;
        }
    

    示例用法:

    string tz = TimeZone.CurrentTimeZone.ToAbbreviation();
    string formattedDate = String.Format("{0:yyyy/MM/dd hh:mm:ss} {1}", myDate, tz);
    

    或者,如果您只想从DateTime对象中获取格式化的日期字符串:

    public static string ToLocalTimeWithTimeZoneAbbreviation(this DateTime dt)
    {
        DateTime localtime = dt.ToLocalTime();
        string tz = TimeZone.CurrentTimeZone.ToAbbreviation();
    
        string formattedDate = String.Format("{0:yyyy/MM/dd hh:mm:ss} {1}", localtime, tz);
        return formattedDate;
    }
    

    并按如下方式使用:

    string formattedDate = myDateTimeObject.ToLocalTimeWithTimeZoneAbbreviation()
    

    输出: 2019-06-24 02:26:31 EST

        7
  •  1
  •   Community Mohan Dere    9 年前

    我也有类似的问题,但不想使用第三方图书馆(正如大多数答案所暗示的那样)。如果您只想支持.Net的时区名称,并决定使用查找表,请查看 my answer over here ,它依靠PHP来帮助生成缩写列表。您可以调整那里的代码片段和表格以满足您的需求。

        8
  •  0
  •   thepeacekpr    4 年前
    void Main()
    {
    Console.WriteLine(TimeZoneDecoder(TimeZoneInfo.Local.Id));
    }
    
    private string TimeZoneDecoder(string timeZone)
            {
                string abb;
    
                switch (timeZone)
                {
                    case "Eastern Standard Time":
                        abb = "ET";
                        break;
                    case "Central Standard Time":
                        abb = "CT";
                        break;
                    case "Mountain Standard Time":
                        abb = "MST";
                        break;
                    case "Pacific Standard Time":
                        abb = "PT";
                        break;
                    case "Alaskan Standard Time":
                        abb = "AK";
                        break;
                    case "Hawaiian Standard Time":
                        abb = "HAST";
                        break;
                    case "Atlantic Standard Time":
                        abb = "AST";
                        break;
                    case "Morocco Standard Time":
                        abb = "MOST";
                        break;
                    case "UTC":
                        abb = "UTC";
                        break;
                    case "GMT Standard Time":
                        abb = "GMT";
                        break;
                    case "Greenwich Standard Time":
                        abb = "GST";
                        break;
                    case "West Europe Standard Time":
                        abb = "WET";
                        break;
                    case "Central Europe Standard Time":
                        abb = "CET";
                        break;
                    case "Romance Standard Time":
                        abb = "RST";
                        break;
                    case "Central European Standard Time":
                        abb = "CEST";
                        break;
                    case "W. Central Africa Standard Time":
                        abb = "ECT";
                        break;
                    case "Jordan Standard Time":
                        abb = "JST";
                        break;
                    case "GTB Standard Time":
                        abb = "GTBST";
                        break;
                    case "Middle East Standard Time":
                        abb = "MEST";
                        break;
                    case "Egypt Standard Time":
                        abb = "EGST";
                        break;
                    case "Syria Standard Time":
                        abb = "SST";
                        break;
                    case "South Africa Standard Time":
                        abb = "SAST";
                        break;
                    case "FLE Standard Time":
                        abb = "EET";
                        break;
                    case "Israel Standard Time":
                        abb = "ISST";
                        break;
                    case "E. Europe Standard Time":
                        abb = "EEST";
                        break;
                    case "Namibia Standard Time":
                        abb = "NMST";
                        break;
                    case "Arabic Standard Time":
                        abb = "ARST";
                        break;
                    case "Arab Standard Time":
                        abb = "ABST";
                        break;
                    case "Russian Standard Time":
                        abb = "MSK";
                        break;
                    case "E. Africa Standard Time":
                        abb = "EAT";
                        break;
                    case "Iran Standard Time":
                        abb = "IRST";
                        break;
                    case "Arabian Standard Time":
                        abb = "ARBST";
                        break;
                    case "Azerbaijan Standard Time":
                        abb = "AZT";
                        break;
                    case "Mauritius Standard Time":
                        abb = "MUT";
                        break;
                    case "Georgian Standard Time":
                        abb = "GET";
                        break;
                    case "Caucasus Standard Time":
                        abb = "AMT";
                        break;
                    case "Afghanistan Standard Time":
                        abb = "AFT";
                        break;
                    case "Ekaterinburg Standard Time":
                        abb = "YEKT";
                        break;
                    case "Pakistan Standard Time":
                        abb = "PKT";
                        break;
                    case "West Asia Standard Time":
                        abb = "WAST";
                        break;
                    case "India Standard Time":
                        abb = "IST";
                        break;
                    case "Sri Lanka Standard Time":
                        abb = "SLT";
                        break;
                    case "Nepal Standard Time":
                        abb = "NPT";
                        break;
                    case "Central Asia Standard Time":
                        abb = "BTT";
                        break;
                    case "Bangladesh Standard Time":
                        abb = "BST";
                        break;
                    case "N. Central Asia Standard Time":
                        abb = "NCAST";
                        break;
                    case "Myanmar Standard Time":
                        abb = "MYST";
                        break;
                    case "SE Asia Standard Time":
                        abb = "THA";
                        break;
                    case "North Asia Standard Time":
                        abb = "KRAT";
                        break;
                    case "China Standard Time":
                        abb = "CST";
                        break;
                    case "North Asia East Standard Time":
                        abb = "IRKT";
                        break;
                    case "Singapore Standard Time":
                        abb = "SNST";
                        break;
                    case "W. Australia Standard Time":
                        abb = "AWST";
                        break;
                    case "Taipei Standard Time":
                        abb = "TIST";
                        break;
                    case "Ulaanbaatar Standard Time":
                        abb = "UST";
                        break;
                    case "Tokyo Standard Time":
                        abb = "TST";
                        break;
                    case "Korea Standard Time":
                        abb = "KST";
                        break;
                    case "Yakutsk Standard Time":
                        abb = "YAKT";
                        break;
                    case "Cen. Australia Standard Time":
                        abb = "CAUST";
                        break;
                    case "AUS Central Standard Time":
                        abb = "ACST";
                        break;
                    case "E. Australia Standard Time":
                        abb = "EAST";
                        break;
                    case "AUS Eastern Standard Time":
                        abb = "AEST";
                        break;
                    case "West Pacific Standard Time":
                        abb = "WPST";
                        break;
                    case "Tasmania Standard Time":
                        abb = "TAST";
                        break;
                    case "Vladivostok Standard Time":
                        abb = "VLAT";
                        break;
                    case "Central Pacific Standard Time":
                        abb = "SBT";
                        break;
                    case "New Zealand Standard Time":
                        abb = "NZST";
                        break;
                    case "UTC+12":
                        abb = "UTC12";
                        break;
                    case "Fiji Standard Time":
                        abb = "FJT";
                        break;
                    case "Kamchatka Standard Time":
                        abb = "PETT";
                        break;
                    case "Tonga Standard Time":
                        abb = "PHOT";
                        break;
                    case "Azores Standard Time":
                        abb = "AZOST";
                        break;
                    case "Cape Verde Standard Time":
                        abb = "CVT";
                        break;
                    case "E. South America Standard Time":
                        abb = "ESAST";
                        break;
                    case "Argentina Standard Time":
                        abb = "ART";
                        break;
                    case "SA Eastern Standard Time":
                        abb = "SAEST";
                        break;
                    case "Greenland Standard Time":
                        abb = "GNST";
                        break;
                    case "Montevideo Standard Time":
                        abb = "MVST";
                        break;
                    case "Newfoundland Standard Time":
                        abb = "NST";
                        break;
                    case "Paraguay Standard Time":
                        abb = "PRST";
                        break;
                    case "Central Brazilian Standard Time":
                        abb = "CBST";
                        break;
                    case "SA Western Standard Time":
                        abb = "SAWST";
                        break;
                    case "Pacific SA Standard Time":
                        abb = "PSAST";
                        break;
                    case "Venezuela Standard Time":
                        abb = "VST";
                        break;
                    case "SA Pacific Standard Time":
                        abb = "SAPST";
                        break;
                    case "US Eastern Standard Time":
                        abb = "EST";
                        break;
                    case "Central America Standard Time":
                        abb = "CAST";
                        break;
                    case "Central Standard Time (Mexico)":
                        abb = "CST";
                        break;
                    case "Canada Central Standard Time":
                        abb = "CCST";
                        break;
                    case "Mountain Standard Time (Mexico)":
                        abb = "MSTM";
                        break;
                    case "Pacific Standard Time (Mexico)":
                        abb = "PST";
                        break;
                    case "Samoa Standard Time":
                        abb = "SMST";
                        break;
                    case "Dateline Standard Time":
                        abb = "BIT";
                        break;
                    default:
                        abb = timeZone;
                        break;
                }
    
                return abb;
            }
    
        9
  •  0
  •   Zon    4 年前

    您可以使用 this spreadsheet 所有时区缩写组合如下:

    COUNTRY_CODE    STD_UTC_OFFSET  DST_UTC_OFFSET  STD_ABBREVIATION    DST_ABBREVIATION
    MX              −08:00          −07:00          PST                 PDT     
    
    COORDINATES IANA    DESCRIPTION             LOCATION
    America/Ensenada    Pitcairn Standard Time  Pacific