private DateTime ComputeDateTimeTimeZoneLocalDateUtc(TimeSpan value) { if (CurrentDate.Kind != DateTimeKind.Local) { throw new Exception("Invalid CurrentDate DateTimeKind : must be Local"); } var baseUtcOffset = TimeZone.BaseUtcOffset; var dateTime = ComputeNewDateTime(value); if (TimeZone.SupportsDaylightSavingTime) { if (TimeZone.IsAmbiguousTime(dateTime)) { if (IsSummerPeriod) { return(new DateTime(dateTime.AddTicks(-baseUtcOffset.Ticks).AddTicks(-TimeZone.GetAdjustmentRules()[0].DaylightDelta.Ticks).Ticks, DateTimeKind.Utc)); } return(new DateTime(dateTime.AddTicks(-baseUtcOffset.Ticks).Ticks, DateTimeKind.Utc)); } IsSummerPeriod = TimeZone.IsDaylightSavingTime(dateTime); } return(dateTime.ToUniversalTime()); }
public override TimeSpan GetDuration(DateTime start, DateTime end) { if (TimeZone.SupportsDaylightSavingTime) { // start if (TimeZone.IsAmbiguousTime(start)) { start = OnAmbiguousMoment(start); } else if (TimeZone.IsInvalidTime(start)) { start = OnInvalidMoment(start); } // end if (TimeZone.IsAmbiguousTime(end)) { end = OnAmbiguousMoment(end); } else if (TimeZone.IsInvalidTime(end)) { end = OnInvalidMoment(end); } } return(base.GetDuration(start, end)); }