// <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); }
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> }
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); }
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..."); } }
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); }
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); }
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)); } }
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); }
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)); }
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)); }
// 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); }
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); }
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 }
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); }
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); }
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); }
/// <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 )); }