27

我想要一个 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

4 回答 4

43

不,它不会返回 Windows 机器知道的每个时区(在我的安装中,它是 91)。您在那里的if陈述是限制您的输出的原因。把它去掉但留下Console.WriteLine部分,你会看到所有 91 个(或更多)时区。

例如

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

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

这应该在您的控制台上写出 91 个时区。

于 2009-01-14T05:58:17.663 回答
5

你的代码对我来说很好。这是我盒子上的输出:

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

这就是目前具有相同偏移量的所有那些,这就是您的代码清楚显示的内容 - 如果您想要所有时区,只需删除“if”部分,正如罗伯特所说。

如果您认为应该看到更多区域,您能否告诉我们您所在的时区,以便我们确定应该显示哪些其他时区?

于 2009-01-14T06:29:55.680 回答
4

该方法用于绑定 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;
}
于 2011-01-07T06:39:25.387 回答
2

如果想要来自 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"
  },...
于 2016-07-13T15:30:59.850 回答