2009-01-14 99 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" 
    },...