tags:

views:

1009

answers:

2

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);
            }
        }
+7  A: 

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.

Robert C. Barth
+3  A: 

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?

Jon Skeet