public static double GetScheduledHours(DateTimeOffset begin, DateTimeOffset end)
return (end.Ticks - begin.Ticks) / 10000 / 1000 / 60 / 60;
public static double GetScheduledHours(DateTime begin, DateTime end)
return (end.ToUniversalTime().Ticks - begin.ToUniversalTime().Ticks) / 10000 / 1000 / 60 / 60;
public static void Test(string test, double actual, double expected)
Console.WriteLine(test + ": " + ((actual == expected) ? "PASS" : "FAIL (Actual: " + actual + ", Expected: " + expected + ")"));
public static void Main()
var easternTz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
var pacificTz = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
var universalTz = TimeZoneInfo.FindSystemTimeZoneById("UTC");
hours = GetScheduledHours(new DateTime(2016, 11, 5), new DateTime(2016, 11, 6));
Test("5th-6th", hours, 24);
hours = GetScheduledHours(new DateTime(2016, 11, 6), new DateTime(2016, 11, 7));
Test("6th-7th", hours, 25);
hours = GetScheduledHours(new DateTime(1917, 11, 6), new DateTime(1917, 11, 7));
Test("6th-7th in 1917", hours, 24);
hours = GetScheduledHours(new DateTime(2016, 11, 7), new DateTime(2016, 11, 8));
Test("7th-8th", hours, 24);
hours = GetScheduledHours(new DateTime(2016, 3, 13), new DateTime(2016, 3, 14));
Test("13th-14th", hours, 23);
hours = GetScheduledHours(new DateTime(1917, 3, 13), new DateTime(1917, 3, 14));
Test("13th-14th in 1917", hours, 24);
hours = GetScheduledHours(new DateTimeOffset(2016, 11, 5, 0, 0, 0, pacificTz.BaseUtcOffset), new DateTimeOffset(2016, 11, 6, 0, 0, 0, pacificTz.BaseUtcOffset));
Test("pst 5th-6th", hours, 24);
hours = GetScheduledHours(new DateTimeOffset(2016, 11, 6, 0, 0, 0, pacificTz.BaseUtcOffset), new DateTimeOffset(2016, 11, 7, 0, 0, 0, pacificTz.BaseUtcOffset));
Test("pst 6th-7th", hours, 25);
hours = GetScheduledHours(new DateTimeOffset(1917, 11, 6, 0, 0, 0, pacificTz.BaseUtcOffset), new DateTimeOffset(1917, 11, 7, 0, 0, 0, pacificTz.BaseUtcOffset));
Test("pst 6th-7th in 1917", hours, 24);
hours = GetScheduledHours(new DateTimeOffset(2016, 11, 7, 0, 0, 0, pacificTz.BaseUtcOffset), new DateTimeOffset(2016, 11, 8, 0, 0, 0, pacificTz.BaseUtcOffset));
Test("pst 7th-8th", hours, 24);
hours = GetScheduledHours(new DateTimeOffset(2016, 3, 13, 0, 0, 0, pacificTz.BaseUtcOffset), new DateTimeOffset(2016, 3, 14, 0, 0, 0, pacificTz.BaseUtcOffset));
Test("pst 13th-14th", hours, 23);
hours = GetScheduledHours(new DateTimeOffset(1917, 3, 13, 0, 0, 0, pacificTz.BaseUtcOffset), new DateTimeOffset(1917, 3, 14, 0, 0, 0, pacificTz.BaseUtcOffset));
Test("pst 13th-14th in 1917", hours, 24);
d1 = new DateTimeOffset(2016, 11, 5, 0, 0, 0, universalTz.BaseUtcOffset).DateTime;
d2 = new DateTimeOffset(2016, 11, 6, 0, 0, 0, universalTz.BaseUtcOffset).DateTime;
hours = GetScheduledHours(d1, d2);
Test("UTC 5th-6th", hours, 24);
var dxxx = new DateTime(2011, 6, 5, 10, 15, 00);
d1 = new DateTimeOffset(2016, 11, 6, 0, 0, 0, universalTz.BaseUtcOffset).DateTime;
d2 = new DateTimeOffset(2016, 11, 7, 0, 0, 0, universalTz.BaseUtcOffset).DateTime;
hours = GetScheduledHours(d1, d2);
Test("UTC 6th-7th", hours, 24);