【问题标题】:How do I enumerate all time zones in .NET?如何枚举 .NET 中的所有时区?
【发布时间】:2010-10-01 07:38:25
【问题描述】:

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

【问题讨论】:

  • 患有剪切-粘贴-炎? :) 您已经在遍历整个枚举,但是使用 if 语句过滤掉与当前枚举不同的偏移量。
  • 我忽略了代码中的 if :(

标签: timezone


【解决方案1】:

该方法用于绑定 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;
}

【讨论】:

    【解决方案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"
      },...
    

    【讨论】:

      【解决方案3】:

      不,它不会返回 Windows 机器知道的每个时区(在我的安装中,它是 91)。您拥有的 if 语句限制了您的输出。把它去掉,但留下Console.WriteLine 部分,你会看到所有 91 个(左右)时区。

      例如

      ReadOnlyCollection<TimeZoneInfo> timeZones = TimeZoneInfo.GetSystemTimeZones();
      
      foreach (TimeZoneInfo timeZoneInfo in timeZones)
        Console.WriteLine("{0}", timeZoneInfo.DisplayName);
      

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

      【讨论】:

      • timeZones.Count = 135
      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-04-13
        • 1970-01-01
        • 2016-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-17
        相关资源
        最近更新 更多