2009-09-09 50 views
12

是否有任何方法從 System.TimeZoneInfo.Local 獲取3個char代碼?如何獲得TimeZoneInfo短名

例如EDT代替東部夏令時等。

+0

應當指出的是,一個人不能僅僅確定日光或不只是一個時區信息。例如,根據建議查看註冊表,可以看到所有名稱只包含「標準」而不是「日光」。因此,在沒有涉及DateTime的情況下,您將無法獲得準確答案(即考慮Daylight)。 – user420667 2017-02-06 22:52:55

回答

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

'Id'的可能值可以在註冊表中的HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Time Zone下找到(它們與http://www.timeanddate.com/library中的名稱不同/ abbreviations/timezones /) – dtb 2009-09-09 23:29:37

+0

@dtb:謝謝。 – 2009-09-09 23:40:51

1

您可以編寫類似:

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