public static void Main()
DateTimeOffset utc = DateTimeOffset.UtcNow;
TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
DateTimeOffset converted = TimeZoneInfo.ConvertTime(utc, zone);
DateTimeOffset startOfDay = GetStartOfDay(converted.DateTime, zone);
Console.WriteLine("Original values:");
Console.WriteLine("Chicago: {0:o} UTC: {1:o} Local: {2:o}", converted, utc, utc.ToLocalTime());
Console.WriteLine("At start of day in Chicago:");
Console.WriteLine("Chicago: {0:o} UTC: {2:o} Local: {2:o}", startOfDay, startOfDay.ToUniversalTime(), startOfDay.ToLocalTime());
static DateTimeOffset GetStartOfDay(DateTime dt, TimeZoneInfo tz)
if (dt.Kind != DateTimeKind.Unspecified)
dt = TimeZoneInfo.ConvertTime(dt, tz);
var gap = tz.GetUtcOffset(dt.AddDays(1)) - tz.GetUtcOffset(dt.AddDays(-1));
var offset = tz.IsAmbiguousTime(d) ? tz.GetAmbiguousTimeOffsets(d).OrderByDescending(x => x).First() : tz.GetUtcOffset(d);
return new DateTimeOffset(d, offset);