// <Snippet4>
    private TimeZoneInfo InitializeTimeZone()
    {
        TimeZoneInfo southPole = null;

        // Determine if South Pole time zone is defined in system
        try
        {
            southPole = TimeZoneInfo.FindSystemTimeZoneById("Antarctica/South Pole Standard Time");
        }
        // Time zone does not exist; create it, store it in a text file, and return it
        catch
        {
            const string filename = @".\TimeZoneInfo.txt";
            bool         found    = false;

            if (File.Exists(filename))
            {
                StreamReader reader = new StreamReader(filename);
                string       timeZoneInfo;
                while (reader.Peek() >= 0)
                {
                    timeZoneInfo = reader.ReadLine();
                    if (timeZoneInfo.Contains("Antarctica/South Pole"))
                    {
                        southPole = TimeZoneInfo.FromSerializedString(timeZoneInfo);
                        reader.Close();
                        found = true;
                        break;
                    }
                }
            }
            if (!found)
            {
                // Define transition times to/from DST
                TimeZoneInfo.TransitionTime startTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 10, 1, DayOfWeek.Sunday);
                TimeZoneInfo.TransitionTime endTransition   = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 3, 3, DayOfWeek.Sunday);
                // Define adjustment rule
                TimeSpan delta = new TimeSpan(1, 0, 0);
                TimeZoneInfo.AdjustmentRule adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1989, 10, 1), DateTime.MaxValue.Date, delta, startTransition, endTransition);
                // Create array for adjustment rules
                TimeZoneInfo.AdjustmentRule[] adjustments = { adjustment };
                // Define other custom time zone arguments
                string   displayName  = "(GMT+12:00) Antarctica/South Pole";
                string   standardName = "Antarctica/South Pole Standard Time";
                string   daylightName = "Antarctica/South Pole Daylight Time";
                TimeSpan offset       = new TimeSpan(12, 0, 0);
                southPole = TimeZoneInfo.CreateCustomTimeZone(standardName, offset, displayName, standardName, daylightName, adjustments);
                // Write time zone to the file
                StreamWriter writer = new StreamWriter(filename, true);
                writer.WriteLine(southPole.ToSerializedString());
                writer.Close();
            }
        }
        return(southPole);
    }
Exemple #2
0
            public void EqualsObject()
            {
                DateTime dt = new DateTime(1, 1, 1, 2, 0, 0, DateTimeKind.Unspecified);

                TimeZoneInfo.TransitionTime tt1 = TimeZoneInfo.TransitionTime.CreateFixedDateRule(dt, 1, 21);
                Assert.IsFalse(tt1.Equals(null), "null");                   // found using Gendarme :)
                Assert.IsTrue(tt1.Equals(tt1), "self");
                TimeZoneInfo.TransitionTime tt2 = TimeZoneInfo.TransitionTime.CreateFixedDateRule(dt, 2, 12);
                Assert.IsFalse(tt2.Equals(tt1), "1!=2");
                Assert.IsFalse(tt1.Equals(tt2), "2!=1");
            }
 private void CompareTransitionTimesForEquality()
 {
     // <Snippet7>
     TimeZoneInfo.TransitionTime tt1 = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 02, 00, 00), 11, 03);
     TimeZoneInfo.TransitionTime tt2 = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 02, 00, 00), 11, 03);
     TimeZoneInfo.TransitionTime tt3 = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 02, 00, 00), 10, 05, DayOfWeek.Sunday);
     Console.WriteLine(tt1.Equals(tt1));      // Returns True (an object always equals itself)
     Console.WriteLine(tt1.Equals(tt2));      // Returns True (identical property values)
     Console.WriteLine(tt1.Equals(tt3));      // Returns False (different property values)
     // </Snippet7>
 }
Exemple #4
0
            public void DeltaNotInSeconds()
            {
                DateTime dateStart = new DateTime(2007, 01, 01);
                DateTime dateEnd   = new DateTime(2008, 01, 01);

                TimeZoneInfo.TransitionTime daylightTransitionStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 03, 11);
                TimeZoneInfo.TransitionTime daylightTransitionEnd   = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 10, 11);
                try {
                    TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(dateStart, dateEnd, new TimeSpan(55), daylightTransitionStart, daylightTransitionEnd);
                    Assert.Fail();
                } catch (ArgumentException) {
                }
            }
            public void Serialize_Deserialize_FixedDateRule()
            {
                TimeZoneInfo.TransitionTime fixedDateRule = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 1, 0, 0), 3, 12);
                MemoryStream    stream    = new MemoryStream();
                BinaryFormatter formatter = new BinaryFormatter();

                formatter.Serialize(stream, fixedDateRule);
                stream.Position = 0;
                TimeZoneInfo.TransitionTime deserialized = (TimeZoneInfo.TransitionTime)formatter.Deserialize(stream);
                stream.Close();
                stream.Dispose();
                Assert.AreEqual(fixedDateRule, deserialized);
            }
Exemple #6
0
 public void DatesMaxMinValid()
 {
     try
     {
         TimeZoneInfo.TransitionTime daylightTransitionStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 03, 11);
         TimeZoneInfo.TransitionTime daylightTransitionEnd   = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 10, 11);
         TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(DateTime.MinValue.Date, DateTime.MaxValue.Date, new TimeSpan(1, 0, 0), daylightTransitionStart, daylightTransitionEnd);
     }
     catch
     {
         Assert.Fail("DateTime.MinValue and MaxValue are not valid...");
     }
 }
Exemple #7
0
        private static DateTime TransitionTimeToDateTime(Int32 year, TimeZoneInfo.TransitionTime transitionTime)
        {
            DateTime value;
            DateTime timeOfDay = transitionTime.TimeOfDay;

            if (transitionTime.IsFixedDateRule)
            {
                Int32 day = DateTime.DaysInMonth(year, transitionTime.Month);
                value = new DateTime(year, transitionTime.Month, (day < transitionTime.Day) ? day : transitionTime.Day,
                                     timeOfDay.Hour, timeOfDay.Minute, timeOfDay.Second, timeOfDay.Millisecond);
            }
            else
            {
                if (transitionTime.Week <= 4)
                {
                    value = new DateTime(year, transitionTime.Month, 1, timeOfDay.Hour, timeOfDay.Minute, timeOfDay.Second, timeOfDay.Millisecond);

                    int dayOfWeek = (int)value.DayOfWeek;
                    int delta     = (int)transitionTime.DayOfWeek - dayOfWeek;
                    if (delta < 0)
                    {
                        delta += 7;
                    }
                    delta += 7 * (transitionTime.Week - 1);

                    if (delta > 0)
                    {
                        value = value.AddDays(delta);
                    }
                }
                else
                {
                    Int32 daysInMonth = DateTime.DaysInMonth(year, transitionTime.Month);
                    value = new DateTime(year, transitionTime.Month, daysInMonth, timeOfDay.Hour, timeOfDay.Minute, timeOfDay.Second, timeOfDay.Millisecond);

                    int dayOfWeek = (int)value.DayOfWeek;
                    int delta     = dayOfWeek - (int)transitionTime.DayOfWeek;
                    if (delta < 0)
                    {
                        delta += 7;
                    }

                    if (delta > 0)
                    {
                        value = value.AddDays(-delta);
                    }
                }
            }
            return(value);
        }
Exemple #8
0
            public void DeltaNotInSeconds()
            {
                if (Environment.OSVersion.Platform != PlatformID.Unix)
                {
                    throw new ArgumentOutOfRangeException();
                }
                ;
                DateTime dateStart = new DateTime(2007, 01, 01);
                DateTime dateEnd   = new DateTime(2008, 01, 01);

                TimeZoneInfo.TransitionTime daylightTransitionStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 03, 11);
                TimeZoneInfo.TransitionTime daylightTransitionEnd   = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 10, 11);
                TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(dateStart, dateEnd, new TimeSpan(55), daylightTransitionStart, daylightTransitionEnd);
            }
Exemple #9
0
            public void BrusselsAdjustments()
            {
                TimeZoneInfo.TransitionTime start = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 3, 5, DayOfWeek.Sunday);
                TimeZoneInfo.TransitionTime end   = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 3, 0, 0), 10, 5, DayOfWeek.Sunday);
                TimeZoneInfo.AdjustmentRule rule  = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(DateTime.MinValue.Date, DateTime.MaxValue.Date, new TimeSpan(1, 0, 0), start, end);
                TimeZoneInfo brussels             = TimeZoneInfo.CreateCustomTimeZone("Europe/Brussels", new TimeSpan(1, 0, 0), "Europe/Brussels", "", "", new TimeZoneInfo.AdjustmentRule [] { rule });

                TimeZoneInfo brussels_sys = TimeZoneInfo.FindSystemTimeZoneById("Europe/Brussels");

                for (DateTime date = new DateTime(2006, 01, 01, 0, 0, 0, DateTimeKind.Local); date < new DateTime(2007, 12, 31, 23, 59, 59); date += new TimeSpan(0, 30, 0))
                {
                    Assert.AreEqual(brussels.GetUtcOffset(date), brussels_sys.GetUtcOffset(date));
                    Assert.AreEqual(brussels.IsDaylightSavingTime(date), brussels_sys.IsDaylightSavingTime(date));
                }
            }
Exemple #10
0
            public void EndBeforeStart()
            {
#if NOT_PFX
                if (Environment.OSVersion.Platform != PlatformID.Unix)
                {
                    throw new ArgumentOutOfRangeException();
                }
                ;
#endif
                DateTime dateStart = new DateTime(2007, 01, 01);
                DateTime dateEnd   = new DateTime(2006, 01, 01);
                TimeZoneInfo.TransitionTime daylightTransitionStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 03, 11);
                TimeZoneInfo.TransitionTime daylightTransitionEnd   = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 10, 11);
                TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(dateStart, dateEnd, new TimeSpan(1, 0, 0), daylightTransitionStart, daylightTransitionEnd);
            }
        public TimeZoneOffsetComponent(TimeZoneOffsetType timeZoneType, TimeZoneInfo timeZone)
            : base(ComponentType.TimeZone, timeZoneType.GetDescription())
        {
            StartDate    = new DateTime(1970, 1, 1, 0, 0, 0);
            TimeZoneInfo = timeZone;
            TimeZoneType = timeZoneType;

            OffsetWinter = TimeZoneInfo.GetUtcOffset(new DateTime(DateTime.Today.Year, 1, 1));
            OffsetSummer = TimeZoneInfo.GetUtcOffset(new DateTime(DateTime.Today.Year, 6, 1));
            OffsetFrom   = TimeZoneType == TimeZoneOffsetType.Standard ? OffsetSummer : OffsetWinter;
            OffsetTo     = TimeZoneType == TimeZoneOffsetType.Standard ? OffsetWinter : OffsetSummer;

            if (!timeZone.SupportsDaylightSavingTime)
            {
                return;
            }

            List <RecurranceValue> items = new List <RecurranceValue>();

            foreach (var rule in timeZone.GetAdjustmentRules())
            {
                if (DateTime.Today.Year < rule.DateStart.Year || DateTime.Today.Year > rule.DateEnd.Year)
                {
                    continue;
                }

                TimeZoneInfo.TransitionTime transition = timeZoneType == TimeZoneOffsetType.Daylight
                    ? rule.DaylightTransitionStart
                    : rule.DaylightTransitionEnd;
                items.Add(new RecurranceValue(RecurrencePrefix.Month, transition.Month));

                if (transition.IsFixedDateRule)
                {
                    items.Add(new RecurranceValue(RecurrencePrefix.MonthDay, transition.Day));
                }
                else
                {
                    int weekNumber = (WeekOfMonth)transition.Week == WeekOfMonth.Last ? -1 : transition.Week;
                    RecurrenceDayOfWeek recurrenceDay = (RecurrenceDayOfWeek)(int)transition.DayOfWeek;

                    items.Add(new RecurranceValue(RecurrencePrefix.Day, weekNumber, recurrenceDay.GetDescription()));
                }

                RecurrenceRule = new RecurrenceRuleElement(RecurrenceFrequency.Yearly, items);
                StartDate      = new DateTime(rule.DateStart.Year <= 1970 ? 1970 : rule.DateStart.Year, rule.DateStart.Month,
                                              rule.DateStart.Day, transition.TimeOfDay.Hour, transition.TimeOfDay.Minute, transition.TimeOfDay.Second);
            }
        }
            public void Serialization_Deserialization()
            {
                TimeZoneInfo.TransitionTime start = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 1, 0, 0), 3, 5, DayOfWeek.Sunday);
                TimeZoneInfo.TransitionTime end   = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 10, 5, DayOfWeek.Sunday);
                TimeZoneInfo.AdjustmentRule rule  = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(DateTime.MinValue.Date, DateTime.MaxValue.Date, new TimeSpan(1, 0, 0), start, end);
                MemoryStream    stream            = new MemoryStream();
                BinaryFormatter formatter         = new BinaryFormatter();

                formatter.Serialize(stream, rule);
                stream.Position = 0;
                TimeZoneInfo.AdjustmentRule deserialized = (TimeZoneInfo.AdjustmentRule)formatter.Deserialize(stream);
                stream.Close();
                stream.Dispose();

                Assert.IsTrue(rule.Equals(deserialized));
            }
        public static Value TransitionTime(TimeZoneInfo.TransitionTime v) => v.IsFixedDateRule
            ? new Entity
        {
            [nameof(v.Day)]             = Int32(v.Day),
            [nameof(v.IsFixedDateRule)] = v.IsFixedDateRule,
            [nameof(v.Month)]           = Int32(v.Month),
            [nameof(v.TimeOfDay)]       = v.TimeOfDay,
        }

            : new Entity
        {
            [nameof(v.DayOfWeek)]       = Int32((int)v.DayOfWeek),
            [nameof(v.IsFixedDateRule)] = v.IsFixedDateRule,
            [nameof(v.Month)]           = Int32(v.Month),
            [nameof(v.TimeOfDay)]       = DateTime(v.TimeOfDay),
            [nameof(v.Week)]            = Int32(v.Week),
        };
 //copy from msdn http://msdn.microsoft.com/en-us/library/system.timezoneinfo.transitiontime.isfixeddaterule.aspx
 private static DateTime GetTransitionDate(TimeZoneInfo.TransitionTime transition, int year)
 {
     if (transition.IsFixedDateRule)
             return new DateTime(year, transition.Month, transition.Day);
         int transitionDay;
         var cal = CultureInfo.CurrentCulture.Calendar;
         var startOfWeek = transition.Week * 7 - 6;
         var firstDayOfWeek = (int)cal.GetDayOfWeek(new DateTime(year, transition.Month, 1));
         var changeDayOfWeek = (int)transition.DayOfWeek;
         if (firstDayOfWeek <= changeDayOfWeek)
             transitionDay = startOfWeek + (changeDayOfWeek - firstDayOfWeek);
         else
             transitionDay = startOfWeek + (7 - firstDayOfWeek + changeDayOfWeek);
         if (transitionDay > cal.GetDaysInMonth(year, transition.Month))
             transitionDay -= 7;
         return new DateTime(year, transition.Month, transitionDay);
 }
Exemple #15
0
            public void Serialization_Deserialization()
            {
                TimeZoneInfo.TransitionTime start = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 1, 0, 0), 3, 5, DayOfWeek.Sunday);
                TimeZoneInfo.TransitionTime end   = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 10, 5, DayOfWeek.Sunday);
                TimeZoneInfo.AdjustmentRule rule  = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(DateTime.MinValue.Date, DateTime.MaxValue.Date, new TimeSpan(1, 0, 0), start, end);
                TimeZoneInfo    london            = TimeZoneInfo.CreateCustomTimeZone("Europe/London", new TimeSpan(0), "Europe/London", "British Standard Time", "British Summer Time", new TimeZoneInfo.AdjustmentRule [] { rule });
                MemoryStream    stream            = new MemoryStream();
                BinaryFormatter formatter         = new BinaryFormatter();

                formatter.Serialize(stream, london);
                stream.Position = 0;
                TimeZoneInfo deserialized = (TimeZoneInfo)formatter.Deserialize(stream);

                stream.Close();
                stream.Dispose();
                Assert.IsTrue(london.Equals(deserialized));
            }
Exemple #16
0
        private DateTime GetTransitionDateTime(TimeZoneInfo.TransitionTime transitionTime)
        {
            DateTime currentDateTime = GetCurrentDateTime();
            int      year            = currentDateTime.Year;

            if (transitionTime.IsFixedDateRule)
            {
                return(new DateTime(
                           year,
                           transitionTime.Month,
                           transitionTime.Day,
                           transitionTime.TimeOfDay.Hour,
                           transitionTime.TimeOfDay.Minute,
                           transitionTime.TimeOfDay.Second,
                           DateTimeKind.Utc));
            }
            return(GetDateTimeNotFixedDateRule(transitionTime, year));
        }
        // https://stackoverflow.com/questions/4764743/get-the-next-date-time-at-which-a-daylight-savings-time-transition-occurs
        private DateTime GetAdjustmentDate(TimeZoneInfo.TransitionTime transitionTime, int year)
        {
            if (transitionTime.IsFixedDateRule)
            {
                return(new DateTime(year, transitionTime.Month, transitionTime.Day));
            }

            // For non-fixed date rules, get local calendar
            var cal = CultureInfo.CurrentCulture.Calendar;

            // Get first day of week for transition
            // For example, the 3rd week starts no earlier than the 15th of the month
            var startOfWeek = transitionTime.Week * 7 - 6;

            // What day of the week does the month start on?
            var firstDayOfWeek = (int)cal.GetDayOfWeek(new DateTime(year, transitionTime.Month, 1));

            // Determine how much start date has to be adjusted
            int transitionDay;
            var changeDayOfWeek = (int)transitionTime.DayOfWeek;

            if (firstDayOfWeek <= changeDayOfWeek)
            {
                transitionDay = startOfWeek + (changeDayOfWeek - firstDayOfWeek);
            }
            else
            {
                transitionDay = startOfWeek + (7 - firstDayOfWeek) + changeDayOfWeek;
            }

            // Adjust for months with no fifth week
            if (transitionDay > cal.GetDaysInMonth(year, transitionTime.Month))
            {
                transitionDay -= 7;
            }

            return(new DateTime(
                       year,
                       transitionTime.Month,
                       transitionDay,
                       transitionTime.TimeOfDay.Hour,
                       transitionTime.TimeOfDay.Minute,
                       transitionTime.TimeOfDay.Second));
        }
Exemple #18
0
            // Converts a TimeZoneInfo "TransitionTime" to a "ZoneYearOffset" - the two correspond pretty closely.
            private static ZoneYearOffset ConvertTransition(TimeZoneInfo.TransitionTime transitionTime)
            {
                // Used for both fixed and non-fixed transitions.
                LocalTime timeOfDay = LocalDateTime.FromDateTime(transitionTime.TimeOfDay).TimeOfDay;

                // Transitions at midnight are represented in the Windows database by a transition one millisecond early.
                // See BclDateTimeZoneTest.TransitionAtMidnight for a concrete example.
                // We adjust to midnight to represent the correct data - it's clear this is just a data fudge.
                // It's probably done like this to allow the rule to represent "Saturday 24:00" instead of "Sunday 00:00".
                bool addDay = false;

                if (timeOfDay == OneMillisecondBeforeMidnight)
                {
                    timeOfDay = LocalTime.Midnight;
                    addDay    = true;
                }

                // Easy case - fixed day of the month.
                if (transitionTime.IsFixedDateRule)
                {
                    return(new ZoneYearOffset(TransitionMode.Wall, transitionTime.Month, transitionTime.Day, 0, false, timeOfDay, addDay));
                }

                // Floating: 1st Sunday in March etc.
                int  dayOfWeek = (int)BclConversions.ToIsoDayOfWeek(transitionTime.DayOfWeek);
                int  dayOfMonth;
                bool advance;

                // "Last"
                if (transitionTime.Week == 5)
                {
                    advance    = false;
                    dayOfMonth = -1;
                }
                else
                {
                    advance = true;
                    // Week 1 corresponds to ">=1"
                    // Week 2 corresponds to ">=8" etc
                    dayOfMonth = (transitionTime.Week * 7) - 6;
                }
                return(new ZoneYearOffset(TransitionMode.Wall, transitionTime.Month, dayOfMonth, dayOfWeek, advance, timeOfDay, addDay));
            }
        private static DateTime GetNonFixedTransitionDate(TimeZoneInfo.TransitionTime transition, int year)
        {
            var calendar       = CultureInfo.CurrentCulture.Calendar;
            int startOfWeek    = transition.Week * 7 - 6;
            int firstDayOfWeek = (int)calendar.GetDayOfWeek(new DateTime(year, transition.Month, 1));

            int changeDayOfWeek = (int)transition.DayOfWeek;

            int transitionDay = (firstDayOfWeek <= changeDayOfWeek)
                ? startOfWeek + (changeDayOfWeek - firstDayOfWeek)
                : startOfWeek + (7 - firstDayOfWeek + changeDayOfWeek);

            if (transitionDay > calendar.GetDaysInMonth(year, transition.Month))
            {
                transitionDay -= 7;
            }

            return(new DateTime(year, transition.Month, transitionDay, transition.TimeOfDay.Hour, transition.TimeOfDay.Minute, transition.TimeOfDay.Second));
        }
        public void GetUTCNowAtDSTBoundaries()
        {
            TimeZoneInfo.TransitionTime startTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 3, 5, DayOfWeek.Sunday);

            TimeZoneInfo.TransitionTime endTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 3, 0, 0), 10, 5, DayOfWeek.Sunday);

            TimeSpan delta = TimeSpan.FromMinutes(60.0);

            TimeZoneInfo.AdjustmentRule   adjustment  = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1970, 1, 1), DateTime.MaxValue.Date, delta, startTransition, endTransition);
            TimeZoneInfo.TransitionTime   startTrans  = adjustment.DaylightTransitionStart;
            TimeZoneInfo.TransitionTime   endTrans    = adjustment.DaylightTransitionEnd;
            TimeZoneInfo.AdjustmentRule[] adjustments = { adjustment };

            TimeZoneInfo tzInfo = TimeZoneInfo.CreateCustomTimeZone("MY Standard Time", TimeSpan.Zero, "MST", "MST", "MDT", adjustments);

            // There is no .NET API to set timezone. Use reflection to assign time zone to the TimeZoneInfo.local field.
            FieldInfo localTimeZone = typeof(TimeZoneInfo).GetField("local", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);

            localTimeZone.SetValue(null, tzInfo);

            DateTime st = new DateTime(2016, 3, 27, 1, 0, 0, DateTimeKind.Local);

            Assert.IsTrue(!tzInfo.IsDaylightSavingTime(st));
            Assert.IsTrue(!tzInfo.IsAmbiguousTime(st));
            Assert.IsTrue((TimeZoneInfo.ConvertTimeToUtc(st).Hour == 1));
            st = new DateTime(2016, 3, 27, 3, 0, 0, DateTimeKind.Local);
            Assert.IsTrue(tzInfo.IsDaylightSavingTime(st));
            Assert.IsTrue(!tzInfo.IsAmbiguousTime(st));
            Assert.IsTrue((TimeZoneInfo.ConvertTimeToUtc(st).Hour == 2));
            st = new DateTime(2016, 10, 30, 2, 0, 0, DateTimeKind.Local);
            Assert.IsTrue(tzInfo.IsDaylightSavingTime(st));
            Assert.IsTrue(!tzInfo.IsAmbiguousTime(st));
            Assert.IsTrue((TimeZoneInfo.ConvertTimeToUtc(st).Hour == 1));
            st = new DateTime(2016, 10, 30, 3, 0, 0, DateTimeKind.Local);
            Assert.IsTrue(!tzInfo.IsDaylightSavingTime(st));
            Assert.IsTrue(tzInfo.IsAmbiguousTime(st));
            Assert.IsTrue((TimeZoneInfo.ConvertTimeToUtc(st).Hour == 3));
            st = new DateTime(2016, 10, 30, 4, 0, 0, DateTimeKind.Local);
            Assert.IsTrue(!tzInfo.IsDaylightSavingTime(st));
            Assert.IsTrue(!tzInfo.IsAmbiguousTime(st));
            Assert.IsTrue((TimeZoneInfo.ConvertTimeToUtc(st).Hour == 4));
        }
        /// <summary>
        /// Creates a time zone transition based on the specified transition time.
        /// </summary>
        /// <param name="timeZoneDefinition">The time zone definition that will own the transition.</param>
        /// <param name="targetPeriod">The period the transition will target.</param>
        /// <param name="transitionTime">The transition time to initialize from.</param>
        /// <returns>A TimeZoneTransition.</returns>
        internal static TimeZoneTransition CreateTimeZoneTransition(
            TimeZoneDefinition timeZoneDefinition,
            TimeZonePeriod targetPeriod,
            TimeZoneInfo.TransitionTime transitionTime)
        {
            TimeZoneTransition transition;

            if (transitionTime.IsFixedDateRule)
            {
                transition = new AbsoluteDayOfMonthTransition(timeZoneDefinition, targetPeriod);
            }
            else
            {
                transition = new RelativeDayOfMonthTransition(timeZoneDefinition, targetPeriod);
            }

            transition.InitializeFromTransitionTime(transitionTime);

            return(transition);
        }
Exemple #22
0
        public static void CreateCustomTimeZone()
        {
            TimeZoneInfo.TransitionTime s1 = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 4, 0, 0), 3, 2, DayOfWeek.Sunday);
            TimeZoneInfo.TransitionTime e1 = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 4, 0, 0), 10, 2, DayOfWeek.Sunday);
            TimeZoneInfo.AdjustmentRule r1 = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(2000, 1, 1), new DateTime(2005, 1, 1), new TimeSpan(1, 0, 0), s1, e1);

            // supports DST
            TimeZoneInfo tz1 = TimeZoneInfo.CreateCustomTimeZone("mytimezone", new TimeSpan(6, 0, 0), null, null, null, new TimeZoneInfo.AdjustmentRule[] { r1 });

            Assert.True(tz1.SupportsDaylightSavingTime);

            // doesn't support DST
            TimeZoneInfo tz2 = TimeZoneInfo.CreateCustomTimeZone("mytimezone", new TimeSpan(4, 0, 0), null, null, null, new TimeZoneInfo.AdjustmentRule[] { r1 }, true);

            Assert.False(tz2.SupportsDaylightSavingTime);

            TimeZoneInfo tz3 = TimeZoneInfo.CreateCustomTimeZone("mytimezone", new TimeSpan(6, 0, 0), null, null, null, null);

            Assert.False(tz3.SupportsDaylightSavingTime);
        }
Exemple #23
0
        public void GetUTCNowAtDSTBoundaries()
        {
            TimeZoneInfo.TransitionTime startTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 3, 5, DayOfWeek.Sunday);

            TimeZoneInfo.TransitionTime endTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 3, 0, 0), 10, 5, DayOfWeek.Sunday);

            TimeSpan delta = TimeSpan.FromMinutes(60.0);

            TimeZoneInfo.AdjustmentRule   adjustment  = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1970, 1, 1), DateTime.MaxValue.Date, delta, startTransition, endTransition);
            TimeZoneInfo.TransitionTime   startTrans  = adjustment.DaylightTransitionStart;
            TimeZoneInfo.TransitionTime   endTrans    = adjustment.DaylightTransitionEnd;
            TimeZoneInfo.AdjustmentRule[] adjustments = { adjustment };

            TimeZoneInfo tzInfo = TimeZoneInfo.CreateCustomTimeZone("MY Standard Time", TimeSpan.Zero, "MST", "MST", "MDT", adjustments);

            TimeZoneInfoTest.SetLocal(tzInfo);

            DateTime st = new DateTime(2016, 3, 27, 1, 0, 0, DateTimeKind.Local);

            Assert.IsTrue(!tzInfo.IsDaylightSavingTime(st));
            Assert.IsTrue(!tzInfo.IsAmbiguousTime(st));
            Assert.IsTrue((TimeZoneInfo.ConvertTimeToUtc(st).Hour == 1));
            st = new DateTime(2016, 3, 27, 3, 0, 0, DateTimeKind.Local);
            Assert.IsTrue(tzInfo.IsDaylightSavingTime(st));
            Assert.IsTrue(!tzInfo.IsAmbiguousTime(st));
            Assert.IsTrue((TimeZoneInfo.ConvertTimeToUtc(st).Hour == 2));
            st = new DateTime(2016, 10, 30, 2, 0, 0, DateTimeKind.Local);
#if !MOBILE
            Assert.IsFalse(tzInfo.IsDaylightSavingTime(st));
            Assert.IsFalse(!tzInfo.IsAmbiguousTime(st));
            Assert.IsFalse((TimeZoneInfo.ConvertTimeToUtc(st).Hour == 1));
            st = new DateTime(2016, 10, 30, 3, 0, 0, DateTimeKind.Local);
            Assert.IsTrue(!tzInfo.IsDaylightSavingTime(st));
            Assert.IsFalse(tzInfo.IsAmbiguousTime(st));
            Assert.IsTrue((TimeZoneInfo.ConvertTimeToUtc(st).Hour == 3));
            st = new DateTime(2016, 10, 30, 4, 0, 0, DateTimeKind.Local);
            Assert.IsTrue(!tzInfo.IsDaylightSavingTime(st));
            Assert.IsTrue(!tzInfo.IsAmbiguousTime(st));
            Assert.IsTrue((TimeZoneInfo.ConvertTimeToUtc(st).Hour == 4));
#endif
        }
Exemple #24
0
        private static DateTime GetTransitionDateTime(TimeZoneInfo.TransitionTime transition, int year)
        {
            DateTime date;

            if (transition.IsFixedDateRule)
            {
                date = new DateTime(year, transition.Month, transition.Day) + transition.TimeOfDay.TimeOfDay;
            }
            else
            {
                date = new DateTime(year, transition.Month, 1);
                date = date.DayOfWeekFromNow(transition.DayOfWeek, transition.Week - 1);
                while (date.Month != transition.Month)
                {
                    date = date.AddDays(-7);
                }
            }

            date = date + transition.TimeOfDay.TimeOfDay;
            return(date);
        }
Exemple #25
0
        private static string FormatTransitionTime(TimeZoneInfo.TransitionTime tt, bool endTime)
        {
            CultureInfo plCi = new CultureInfo("pl-PL");

            Thread.CurrentThread.CurrentCulture = plCi;
            if (endTime && tt.IsFixedDateRule && tt.Day == 1 && tt.Month == 1 && tt.TimeOfDay == DateTime.MinValue)
            {
                return("-");
            }
            string s;

            if (tt.IsFixedDateRule)
            {
                s = tt.Day.ToString();
            }
            else
            {
                s = "Pierwszy drugi trzeci czwarty ostatni".Split()[tt.Week - 1] + " " + CultureInfo.CurrentCulture.DateTimeFormat.GetDayName(tt.DayOfWeek) + " w miesiacu ";
            }
            return(s + DateTimeFormatInfo.CurrentInfo.MonthNames[tt.Month - 1] + " o godzinie " + tt.TimeOfDay.TimeOfDay);
        }
Exemple #26
0
        private static DateTime TransitionPoint(TimeZoneInfo.TransitionTime transition, int year)
        {
            if (transition.IsFixedDateRule)
            {
                return(new DateTime(year, transition.Month, transition.Day) + transition.TimeOfDay.TimeOfDay);
            }

            DayOfWeek first  = (new DateTime(year, transition.Month, 1)).DayOfWeek;
            DayOfWeek target = transition.DayOfWeek;

            // locate first dayofweek
            int dayadjust = (first > target) ? (7 - (int)first + 1) : ((int)target - (int)first + 1);
            // roll to the nth
            int day = dayadjust + (transition.Week - 1) * 7;

            if (day > DateTime.DaysInMonth(year, transition.Month))
            {
                day -= 7;
            }

            return(new DateTime(year, transition.Month, day) + transition.TimeOfDay.TimeOfDay);
        }
        private static DateTime GetDaylightTransition(DateTime date, TimeZoneInfo.TransitionTime transitionTime)
        {
            var daylightTime = new DateTime(date.Year, transitionTime.Month, 1);

            if (transitionTime.IsFixedDateRule)
            {
                daylightTime = new DateTime(daylightTime.Year, daylightTime.Month, transitionTime.Day, transitionTime.TimeOfDay.Hour, transitionTime.TimeOfDay.Minute, transitionTime.TimeOfDay.Second);
            }
            else
            {
                daylightTime = daylightTime.NthOf(transitionTime.Week, transitionTime.DayOfWeek);
            }

            daylightTime = new DateTime(daylightTime.Year,
                                        daylightTime.Month,
                                        daylightTime.Day,
                                        transitionTime.TimeOfDay.Hour,
                                        transitionTime.TimeOfDay.Minute,
                                        transitionTime.TimeOfDay.Second);

            return(daylightTime);
        }
Exemple #28
0
        /// <summary>
        ///     Populates the cal time zone info.
        /// </summary>
        /// <param name="tzi">The time zone info.</param>
        /// <param name="transition">The transition.</param>
        private static void PopulateiCalTimeZoneInfo(ITimeZoneInfo tzi, TimeZoneInfo.TransitionTime transition)
        {
            var recurrence = new RecurrencePattern
            {
                Frequency = FrequencyType.Yearly
            };

            recurrence.ByMonth.Add(transition.Month);
            recurrence.ByHour.Add(transition.TimeOfDay.Hour);
            recurrence.ByMinute.Add(transition.TimeOfDay.Minute);

            if (transition.IsFixedDateRule)
            {
                recurrence.ByMonthDay.Add(transition.Day);
            }
            else
            {
                recurrence.ByDay.Add(transition.Week != 5 ? new WeekDay(transition.DayOfWeek, transition.Week) : new WeekDay(transition.DayOfWeek, -1));
            }

            tzi.RecurrenceRules.Add(recurrence);
        }
    private void GetFloatingTransitionTimes()
    {
        ReadOnlyCollection <TimeZoneInfo> timeZones = TimeZoneInfo.GetSystemTimeZones();

        foreach (TimeZoneInfo zone in timeZones)
        {
            TimeZoneInfo.AdjustmentRule[] adjustmentRules = zone.GetAdjustmentRules();
            DateTimeFormatInfo            dateInfo        = CultureInfo.CurrentCulture.DateTimeFormat;
            foreach (TimeZoneInfo.AdjustmentRule adjustmentRule in adjustmentRules)
            {
                TimeZoneInfo.TransitionTime daylightStart = adjustmentRule.DaylightTransitionStart;
                if (!daylightStart.IsFixedDateRule)
                {
                    Console.WriteLine("{0}, {1:d}-{2:d}: Begins at {3:t} on the {4} {5} of {6}.",
                                      zone.StandardName,
                                      adjustmentRule.DateStart,
                                      adjustmentRule.DateEnd,
                                      daylightStart.TimeOfDay,
                                      ((WeekOfMonth)daylightStart.Week).ToString(),
                                      daylightStart.DayOfWeek.ToString(),
                                      dateInfo.GetMonthName(daylightStart.Month));
                }

                TimeZoneInfo.TransitionTime daylightEnd = adjustmentRule.DaylightTransitionEnd;
                if (!daylightEnd.IsFixedDateRule)
                {
                    Console.WriteLine("{0}, {1:d}-{2:d}: Ends at {3:t} on the {4} {5} of {6}.",
                                      zone.StandardName,
                                      adjustmentRule.DateStart,
                                      adjustmentRule.DateEnd,
                                      daylightEnd.TimeOfDay,
                                      ((WeekOfMonth)daylightEnd.Week).ToString(),
                                      daylightEnd.DayOfWeek.ToString(),
                                      dateInfo.GetMonthName(daylightEnd.Month));
                }
            }
        }
    }
        public static PosixTz.DstRule GetPosixRuleFromTransitionTime(TimeZoneInfo.TransitionTime trasitionTime)
        {
            var time = new PosixTz.TimeUnit(
                trasitionTime.TimeOfDay.Hour,
                trasitionTime.TimeOfDay.Minute,
                trasitionTime.TimeOfDay.Second
                );

            if (trasitionTime.IsFixedDateRule)
            {
                return(new PosixTz.DstRule.FixedDateRule(
                           trasitionTime.Month - 1,
                           trasitionTime.Day - 1,
                           time
                           ));
            }
            return(new PosixTz.DstRule.DayOfWeekRule(
                       trasitionTime.Month,
                       trasitionTime.Week,
                       (int)trasitionTime.DayOfWeek,
                       time
                       ));
        }