Skip to content

Instantly share code, notes, and snippets.

@JerryNixon
Last active August 16, 2018 20:43
Show Gist options
  • Save JerryNixon/57f3be793ec283ae7c09f55a732f3316 to your computer and use it in GitHub Desktop.
Save JerryNixon/57f3be793ec283ae7c09f55a732f3316 to your computer and use it in GitHub Desktop.
US-centric, 99% accurate time zone helper.
class Program
{
static void Main(string[] args)
{
Console.WriteLine(new DateTimeOffset(DateTime.Now));
foreach (var item in Enumerable.Range(1, 10))
{
var date = new DateTime(2018, 8, 16);
var offset = TimeSpan.FromHours(-item);
var now = new DateTimeOffset(date, offset);
Console.WriteLine($"{now} = {TimeZoneHelper.DetermineZone(now)}");
}
Console.WriteLine(string.Empty);
Console.Read();
}
}
public static class TimeZoneHelper
{
/*
* Usage = var zone = DetermineZone(DateTime.Now);
*
* 8/16/2018 12:00:00 PM -01:00 = Unknown
* 8/16/2018 12:00:00 PM -02:00 = Unknown
* 8/16/2018 12:00:00 PM -03:00 = Unknown
* 8/16/2018 12:00:00 PM -04:00 = Eastern
* 8/16/2018 12:00:00 PM -05:00 = Central
* 8/16/2018 12:00:00 PM -06:00 = Mountain
* 8/16/2018 12:00:00 PM -07:00 = Pacific
* 8/16/2018 12:00:00 PM -08:00 = Alaskan
* 8/16/2018 12:00:00 PM -09:00 = Unknown
* 8/16/2018 12:00:00 PM -10:00 = Hawaiian
*/
public enum TimeZoneName
{
Hawaiian,
Alaskan,
Pacific,
Mountain,
Central,
Eastern,
Unknown
}
public static TimeZoneName DetermineZone(DateTimeOffset date)
{
if (TestOffset(TimeZoneName.Hawaiian)) return TimeZoneName.Hawaiian;
else if (TestOffset(TimeZoneName.Alaskan)) return TimeZoneName.Alaskan;
else if (TestOffset(TimeZoneName.Pacific)) return TimeZoneName.Pacific;
else if (TestOffset(TimeZoneName.Mountain)) return TimeZoneName.Mountain;
else if (TestOffset(TimeZoneName.Central)) return TimeZoneName.Central;
else if (TestOffset(TimeZoneName.Eastern)) return TimeZoneName.Eastern;
else return TimeZoneName.Unknown;
bool TestOffset(TimeZoneName zone)
{
var info = GetZoneInfo(zone);
var offset = info.IsDaylightSavingTime(date)
? info.BaseUtcOffset.Add(TimeSpan.FromHours(1))
: info.BaseUtcOffset;
return Equals(date.Offset, offset);
}
TimeZoneInfo GetZoneInfo(TimeZoneName zone)
{
switch (zone)
{
case TimeZoneName.Hawaiian: return TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time");
case TimeZoneName.Alaskan: return TimeZoneInfo.FindSystemTimeZoneById("Alaskan Standard Time");
case TimeZoneName.Pacific: return TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
case TimeZoneName.Mountain: return TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
case TimeZoneName.Central: return TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
case TimeZoneName.Eastern: return TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
case TimeZoneName.Unknown: throw new NotSupportedException("TimeZone.Unknown");
default: throw new TimeZoneNotFoundException();
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment