using System; namespace NCC.TaskScheduler { /// /// 处理不同平台时区的区别 /// internal static class TimeZoneHelper { public static bool IsAmbiguousTime(TimeZoneInfo zone, DateTime ambiguousTime) { return zone.IsAmbiguousTime(ambiguousTime.AddTicks(1)); } public static TimeSpan GetDaylightOffset(TimeZoneInfo zone, DateTime ambiguousDateTime) { var offsets = GetAmbiguousOffsets(zone, ambiguousDateTime); var baseOffset = zone.BaseUtcOffset; if (offsets[0] != baseOffset) return offsets[0]; return offsets[1]; } public static DateTimeOffset GetDaylightTimeStart(TimeZoneInfo zone, DateTime invalidDateTime) { var dstTransitionDateTime = new DateTime(invalidDateTime.Year, invalidDateTime.Month, invalidDateTime.Day, invalidDateTime.Hour, invalidDateTime.Minute, 0, 0, invalidDateTime.Kind); while (zone.IsInvalidTime(dstTransitionDateTime)) { dstTransitionDateTime = dstTransitionDateTime.AddMinutes(1); } var dstOffset = zone.GetUtcOffset(dstTransitionDateTime); return new DateTimeOffset(dstTransitionDateTime, dstOffset); } public static DateTimeOffset GetStandardTimeStart(TimeZoneInfo zone, DateTime ambiguousTime, TimeSpan daylightOffset) { var dstTransitionEnd = GetDstTransitionEndDateTime(zone, ambiguousTime); return new DateTimeOffset(dstTransitionEnd, daylightOffset).ToOffset(zone.BaseUtcOffset); } public static DateTimeOffset GetAmbiguousIntervalEnd(TimeZoneInfo zone, DateTime ambiguousTime) { var dstTransitionEnd = GetDstTransitionEndDateTime(zone, ambiguousTime); return new DateTimeOffset(dstTransitionEnd, zone.BaseUtcOffset); } public static DateTimeOffset GetDaylightTimeEnd(TimeZoneInfo zone, DateTime ambiguousTime, TimeSpan daylightOffset) { var daylightTransitionEnd = GetDstTransitionEndDateTime(zone, ambiguousTime); return new DateTimeOffset(daylightTransitionEnd.AddTicks(-1), daylightOffset); } private static TimeSpan[] GetAmbiguousOffsets(TimeZoneInfo zone, DateTime ambiguousTime) { return zone.GetAmbiguousTimeOffsets(ambiguousTime.AddTicks(1)); } private static DateTime GetDstTransitionEndDateTime(TimeZoneInfo zone, DateTime ambiguousDateTime) { var dstTransitionDateTime = new DateTime(ambiguousDateTime.Year, ambiguousDateTime.Month, ambiguousDateTime.Day, ambiguousDateTime.Hour, ambiguousDateTime.Minute, 0, 0, ambiguousDateTime.Kind); while (zone.IsAmbiguousTime(dstTransitionDateTime)) { dstTransitionDateTime = dstTransitionDateTime.AddMinutes(1); } return dstTransitionDateTime; } } }