private static DateTime ToStandardTime(DateTime dateTime, AmbiguousTimeResolution ambiguousTimeResolution) { var adjustmentRule = LocalTimeZoneInfo.GetAdjustmentRules().FirstOrDefault(r => dateTime.Between(r.DateStart, r.DateEnd)); if (adjustmentRule == null) { return(dateTime); } var daylightStart = adjustmentRule.DaylightStart(); var daylightStarted = daylightStart + adjustmentRule.DaylightDelta; var daylightEnd = adjustmentRule.DaylightEnd(); var daylightEnded = daylightEnd - adjustmentRule.DaylightDelta; if (daylightStart <= dateTime && dateTime < daylightStarted) { throw new InvalidDateTimeException(dateTime, LocalTimeZoneInfo); } var isAmbiguous = dateTime.Between(daylightEnded, daylightEnd); if (isAmbiguous && ambiguousTimeResolution == AmbiguousTimeResolution.Exception) { throw new AmbiguousDateTimeException(dateTime, LocalTimeZoneInfo); } if (dateTime.Between(daylightStarted, daylightEnded) || isAmbiguous && ambiguousTimeResolution == AmbiguousTimeResolution.DaylightSaving) { return(dateTime - adjustmentRule.DaylightDelta); } return(dateTime); }
public static NSDate ToNSDate(this DateTime dateTime, AmbiguousTimeResolution ambiguousTimeResolution) { var dateTimeInStandard = ToStandardTime(dateTime, ambiguousTimeResolution); var dateTimeInUtc = dateTimeInStandard - LocalTimeZoneInfo.BaseUtcOffset; var sinceReferenceDate = dateTimeInUtc - ReferenceDateInUtc; return(Foundation.NSDate.FromTimeIntervalSinceReferenceDate(sinceReferenceDate.TotalSeconds)); }
public static void IsAmbiguous(this DateTime dateTime, string andItShouldBeConvertedTo, AmbiguousTimeResolution butItIs) { var ex = Assert.Throws <AmbiguousDateTimeException>(() => dateTime.ToNSDate()); Assert.AreEqual( $"{dateTime:yyyy-MM-dd, HH:mm:ss} is ambiguous in the time zone '{DateTimeExtensions.LocalTimeZoneInfo.DisplayName}'!", ex.Message); ex = Assert.Throws <AmbiguousDateTimeException>(() => dateTime.ToNSDate(AmbiguousTimeResolution.Exception)); Assert.AreEqual( $"{dateTime:yyyy-MM-dd, HH:mm:ss} is ambiguous in the time zone '{DateTimeExtensions.LocalTimeZoneInfo.DisplayName}'!", ex.Message); Assert.AreEqual(andItShouldBeConvertedTo, dateTime.ToNSDate(butItIs).ToString()); }