如何枚举.NET中的所有时区?

时间:2009-01-14 05:35:26

标签: timezone

我想要一个Windows机器上所有可用时区的列表。我怎么能在.NET中这样做?

我知道TimeZoneInfo.GetSystemTimeZones方法,但这只返回当前选定的时区

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

4 个答案:

答案 0 :(得分:42)

不,它没有,它返回Windows机器知道的每个时区(在我的安装中,那是91)。您拥有的if语句限制了您的输出。拿出来然后离开Console.WriteLine部分,你会看到所有91个(左右)时区。

e.g。

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

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

应该将91个时区写入你的控制台。

答案 1 :(得分:4)

您的代码适用于我。这是我的盒子上的输出:

  

您可能在以下时间   区域:(GMT)卡萨布兰卡(GMT)
  格林威治标准时间:都柏林,
  爱丁堡,里斯本,伦敦(GMT)
  蒙罗维亚,雷克雅未克

这就是目前具有相同偏移量的所有内容,这是您的代码清晰显示的内容 - 如果您想要所有时区,只需删除“if”部分,如Robert所说。 / p>

如果你认为你应该看到更多区域,你能告诉我们你所在的时区吗?我们可以弄清楚应该展示哪些区域?

答案 2 :(得分: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;
}

答案 3 :(得分: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"
  },...