[corlib] Add range check for minimal date in dst calculation. Fixes #41667
authorMarek Safar <marek.safar@gmail.com>
Tue, 21 Jun 2016 13:15:12 +0000 (15:15 +0200)
committerMarek Safar <marek.safar@gmail.com>
Tue, 21 Jun 2016 13:16:45 +0000 (15:16 +0200)
mcs/class/corlib/System/TimeZoneInfo.cs
mcs/class/corlib/Test/System/TimeZoneInfoTest.cs

index d03405487df0b4d8c199267212373e81b8a8d56c..fc1cd5448262fa7c0dc7720e5bec7d2ec910409f 100644 (file)
@@ -873,7 +873,7 @@ namespace System
                                return true;
 
                        // We might be in the dateTime previous year's DST period
-                       return IsInDSTForYear (rule, dateTime, dateTime.Year - 1);
+                       return dateTime.Year > 1 && IsInDSTForYear (rule, dateTime, dateTime.Year - 1);
                }
 
                bool IsInDSTForYear (AdjustmentRule rule, DateTime dateTime, int year)
index 99a1f66a1f3fcb933e3ef2d1bec6f7da42d39370..5ede3b2ea8fd17d38ab774ed47a20e5cdc5cad8b 100644 (file)
@@ -1158,6 +1158,22 @@ namespace MonoTests.System
                          Assert.AreEqual(baseUtcOffset, cairo.GetUtcOffset(offset), "dst2End_with_dstOffset+baseUtcOffset#exact");
                          Assert.AreEqual(baseUtcOffset, cairo.GetUtcOffset(offset.Add(new TimeSpan(0, 0, 0, 1))), "dst2End_with_dstOffset+baseUtcOffset#after");
                  }
+
+                       [Test]
+                       public void DTS_WithMinimalDate ()
+                       {
+                               TimeZoneInfo.TransitionTime startTransition, endTransition;
+                               startTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule (new DateTime (1, 1, 1, 4, 0, 0),
+                                                                                                                                                                 10, 2, DayOfWeek.Sunday);
+                               endTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule (new DateTime (1, 1, 1, 3, 0, 0),
+                                                                                                                                                               3, 2, DayOfWeek.Sunday);
+
+                               var ctz = TimeZoneInfo.CreateCustomTimeZone ("test", TimeSpan.FromHours (-5), "display", "sdisplay", "dst", new [] {
+                                       TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule (DateTime.MinValue, DateTime.MaxValue.Date, TimeSpan.FromHours (-1), startTransition, endTransition) });
+
+                               var offset = ctz.GetUtcOffset (DateTime.MinValue);
+                               Assert.AreEqual (TimeSpan.FromHours (-5), offset); // TODO: Wrong it should be -6
+                       }
     }
 
                [TestFixture]