2009-01-14 12 views
25

我想要列出Windows機器上可用的所有時區。我怎樣才能在.NET中做到這一點?如何枚舉.NET中的所有時區?

我瞭解TimeZoneInfo.GetSystemTimeZones方法,但這僅返回當前選擇的時區(S)

DateTimeOffset current = DateTimeOffset.Now; 
ReadOnlyCollection<TimeZoneInfo> timeZones = TimeZoneInfo.GetSystemTimeZones(); 
Console.WriteLine("You might be in the following time zones:"); 
foreach (TimeZoneInfo timeZoneInfo in timeZones) 
{ 
    // Compare offset with offset for that date in that time zone 
    if (timeZoneInfo.GetUtcOffset(current).Equals(current.Offset)) 
    { 
     Console.WriteLine(" {0}", timeZoneInfo.DisplayName); 
    } 
} 
+0

從切口正患 - 粘貼 - 炎? :)你已經迭代了整個枚舉,但是用if語句過濾掉了與當前不一樣的偏移量。 – Spoike 2009-01-14 07:02:28

+0

我忽略瞭如果在代碼:( – gyurisc 2009-01-14 07:28:56

回答

41

不,它不需要,它返回Windows機器知道每一個時區(以我的安裝,這是91)。您在那裏的if聲明是什麼限制了您的輸出。拿出來,但離開Console.WriteLine部分,你會看到所有91(或左右)的時區。

例如

ReadOnlyCollection<TimeZoneInfo> timeZones = TimeZoneInfo.GetSystemTimeZones(); 

foreach (TimeZoneInfo timeZoneInfo in timeZones) 
    Console.WriteLine("{0}", timeZoneInfo.DisplayName); 

這應該寫出91個時區到您的控制檯。

4

你的代碼適合我。這裏有我的盒子輸出:

你可能會在接下來的時間 區:(GMT)卡薩布蘭卡(GMT)
格林威治時間:都柏林,
愛丁堡,里斯本,倫敦(GMT)
蒙羅維亞,雷克雅未克

這是所有具有相同的那些此刻,這是你的代碼清楚地顯示偏移 - 如果你想所有的時區,只是刪除了「如果」的一部分,羅伯特說。

如果你認爲你應該看到更多的區域,你能告訴我們你在哪個時區,所以我們可以計算出應該顯示哪些其他區域?

3

該方法用於綁定Dev express Drop Down中的所有時區。 我希望這會對某人有所幫助。

private void FillTimeZone(ASPxComboBox ddlTimeZone) 
{ 
    ddlTimeZone.DataSource = TimeZoneInfo.GetSystemTimeZones(); 
    ddlTimeZone.DataBind(); 
    ListEditItem oListEditItem=new ListEditItem(); 
    oListEditItem.Text=Helper.SELECT; 
    oListEditItem.Value=Helper.SELECT; 
    ddlTimeZone.Items.Add(oListEditItem); 
    ddlTimeZone.SelectedIndex = 0; 
} 
1

如果希望從一個的WebAPI呼叫的輸出JSON:

using System; 
using System.Collections.Generic; 

namespace MyProject.ViewModels 
{ 
    public class TimeZoneViewModel 
    { 
     public readonly List<CTimeZone> CTimeZones; 

     public TimeZoneViewModel() 
     { 
      CTimeZones = new List<CTimeZone>(); 
      foreach (TimeZoneInfo z in TimeZoneInfo.GetSystemTimeZones()) 
      { 
       var tz = new CTimeZone(z.Id, z.DisplayName, z.BaseUtcOffset); 
       CTimeZones.Add(tz); 
      } 
     } 

    } 

    public class CTimeZone 
    { 
     public string Id { get; set; } 
     public string DisplayName { get; set; } 
     public TimeSpan BaseUtcOffset { get; set; } 

     public CTimeZone(string id, string displayName, TimeSpan utcOffset) 
     { 
      Id = id; 
      DisplayName = displayName; 
      BaseUtcOffset = utcOffset; 
     } 
    } 
} 

然後用它在的WebAPI:

[HttpGet("Api/TimeZones")] 
public JsonResult GetTimeZones() 
{ 
    return Json(new TimeZoneViewModel().CTimeZones); 
} 

輸出:

[{ 
    "id": "Dateline Standard Time", 
    "displayName": "(UTC-12:00) International Date Line West", 
    "baseUtcOffset": "-12:00:00" 
    }, 
    { 
    "id": "UTC-11", 
    "displayName": "(UTC-11:00) Coordinated Universal Time-11", 
    "baseUtcOffset": "-11:00:00" 
    }, 
    { 
    "id": "Aleutian Standard Time", 
    "displayName": "(UTC-10:00) Aleutian Islands", 
    "baseUtcOffset": "-10:00:00" 
    }, 
    { 
    "id": "Hawaiian Standard Time", 
    "displayName": "(UTC-10:00) Hawaii", 
    "baseUtcOffset": "-10:00:00" 
    },...