using System.Collections.Generic;
public static void Main()
var offsets = GetOffsets(simplified: true);
public static IEnumerable<TimeSpan> GetOffsets(bool simplified)
return simplified ? GetSimplifiedOffsets() : GetAllOffsets();
private static IEnumerable<TimeSpan> GetSimplifiedOffsets()
var currentYear = DateTime.UtcNow.Year;
var offsets = new HashSet<TimeSpan>();
foreach (var tz in TimeZoneInfo.GetSystemTimeZones())
var yearsToTest = new HashSet<int>{currentYear};
foreach (var rule in tz.GetAdjustmentRules())
yearsToTest.Add(rule.DateStart.Year);
foreach (var year in yearsToTest)
var o1 = tz.GetUtcOffset(new DateTime(year, 1, 1));
var o2 = tz.GetUtcOffset(new DateTime(year, 7, 1));
if (o1.Ticks % TimeSpan.TicksPerMinute == 0)
if (o2.Ticks % TimeSpan.TicksPerMinute == 0)
return offsets.OrderBy(x => x);
private static IEnumerable<TimeSpan> GetAllOffsets()
var min = TimeSpan.FromHours(-14);
var max = TimeSpan.FromHours(14);
var interval = TimeSpan.FromMinutes(1);
for (var o = min; o <= max; o = o.Add(interval))
private static void DisplayOffsets(IEnumerable<TimeSpan> offsets)
foreach (var offset in offsets)
var sign = offset < TimeSpan.Zero ? "-" : "+";
Console.WriteLine("{0}{1:hh\\:mm}", sign, offset);