2009-09-09 33 views
12

Có phương pháp nào để lấy mã 3 char từ System.TimeZoneInfo.Local không?cách lấy tên viết tắt TimeZoneInfo

ví dụ: EDT thay vì Giờ ban ngày Miền Đông, v.v.

+0

Cần lưu ý rằng người ta không thể chỉ đơn thuần là xác định ánh sáng ban ngày hay không từ chỉ là một thông tin múi giờ. Ví dụ, nhìn vào sổ đăng ký như được đề xuất, người ta có thể thấy tất cả các tên chỉ bao gồm "Chuẩn" chứ không phải "Ánh sáng ban ngày". Do đó bạn sẽ không có câu trả lời chính xác (có tính đến Ánh sáng ban ngày) mà không liên quan đến DateTime ở đâu đó. – user420667

Trả lời

9

Thật không may, không có cách nào dễ dàng tích hợp để thực hiện việc này mà tôi biết. Tuy nhiên, bạn có thể đặt một cái gì đó lại với nhau. Dưới đây là một ví dụ:

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

    } 

} 

Sử dụng như sau:

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

Nếu bạn cần thêm chuyển đổi mà bạn chỉ có thể cắm chúng vào từ điển Map.

TimeZoneInfo.Id sẽ là một chuỗi khớp với khóa đã cho trong [HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Múi giờ]. Nếu bạn có thể tìm thấy một cơ sở dữ liệu phù hợp trực tuyến, có cùng các Id cũng như các từ viết tắt, bạn có thể nhanh chóng trích xuất và nhập các cặp (với các biểu thức chính quy) và thả các từ đó vào từ điển Bản đồ.

+1

Các giá trị có thể cho 'Id' có thể được tìm thấy trong sổ đăng ký dưới' HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Time Zone' (chúng khác với các tên trong http://www.timeanddate.com/library/chữ viết tắt/múi giờ /) – dtb

+0

@dtb: Cảm ơn bạn. –

1

Bạn có thể viết một cái gì đó như:

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

Và helper cho nó:

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); 
    } 
} 
Các vấn đề liên quan