コード例 #1
0
        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);
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        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());
        }