How do I enumerate all time zones in .NET?

2019-01-13 15:49发布

I would like to have a list of all the time zones available on a Windows Machine. How can I do this in .NET?

I know about the TimeZoneInfo.GetSystemTimeZones method, but this returns only the currently selected time zone(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);
   }
}

标签: timezone
4条回答
倾城 Initia
2楼-- · 2019-01-13 16:18

No it doesn't, it returns every time zone the Windows machine knows about (in my installation, that's 91). The if statement you have there is what is limiting your output. Take that out but leave the Console.WriteLine part, and you'll see all 91 (or so) timezones.

e.g.

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

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

That should write out 91 timezones to your console.

查看更多
Root(大扎)
3楼-- · 2019-01-13 16:23

Your code works fine for me. Here's the output on my box:

You might be in the following time zones: (GMT) Casablanca (GMT)
Greenwich Mean Time : Dublin,
Edinburgh, Lisbon, London (GMT)
Monrovia, Reykjavik

That's all the ones with the same offset at the moment, which is what your code clearly displays - if you want all the timezones, just remove the "if" part, as Robert says.

If you think you should be seeing more zones, could you tell us which timezone you're in so we can work out what other ones should be displayed?

查看更多
相关推荐>>
4楼-- · 2019-01-13 16:28

If wanting a json output from a WebAPI call:

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

Then use it in WebAPI:

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

Output:

[{
    "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"
  },...
查看更多
冷血范
5楼-- · 2019-01-13 16:38

This method is used to bind all timezones in Dev express Drop Down. I hope it will help for Someone.

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;
}
查看更多
登录 后发表回答