2 // TimeZoneTest.cs - NUnit Test Cases for the System.TimeZone struct
5 // Martin Baulig (martin@gnome.org)
6 // Sebastien Pouliot <sebastien@ximian.com>
8 // (C) 2002 Martin Baulig
9 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
12 using NUnit.Framework;
15 using System.Threading;
16 using System.Globalization;
17 using System.Runtime.Serialization.Formatters.Binary;
19 namespace MonoTests.System {
21 public class TimeZoneTest : TestCase {
23 private CultureInfo oldcult;
25 public TimeZoneTest() {}
27 protected override void SetUp ()
29 oldcult = Thread.CurrentThread.CurrentCulture;
30 Thread.CurrentThread.CurrentCulture = new CultureInfo ("");
33 protected override void TearDown ()
35 Thread.CurrentThread.CurrentCulture = oldcult;
38 private void CET (TimeZone t1)
40 AssertEquals("A01", "CET", t1.StandardName);
41 AssertEquals("A02", "CEST", t1.DaylightName);
43 DaylightTime d1 = t1.GetDaylightChanges (2002);
44 AssertEquals("A03", "03/31/2002 02:00:00", d1.Start.ToString ("G"));
45 AssertEquals("A04", "10/27/2002 03:00:00", d1.End.ToString ("G"));
46 AssertEquals("A05", 36000000000L, d1.Delta.Ticks);
48 DaylightTime d2 = t1.GetDaylightChanges (1996);
49 AssertEquals("A06", "03/31/1996 02:00:00", d2.Start.ToString ("G"));
50 AssertEquals("A07", "10/27/1996 03:00:00", d2.End.ToString ("G"));
51 AssertEquals("A08", 36000000000L, d2.Delta.Ticks);
53 DateTime d3 = new DateTime (2002,2,25);
54 AssertEquals("A09", false, t1.IsDaylightSavingTime (d3));
55 DateTime d4 = new DateTime (2002,4,2);
56 AssertEquals("A10", true, t1.IsDaylightSavingTime (d4));
57 DateTime d5 = new DateTime (2002,11,4);
58 AssertEquals("A11", false, t1.IsDaylightSavingTime (d5));
60 AssertEquals("A12", 36000000000L, t1.GetUtcOffset (d3).Ticks);
61 AssertEquals("A13", 72000000000L, t1.GetUtcOffset (d4).Ticks);
62 AssertEquals("A14", 36000000000L, t1.GetUtcOffset (d5).Ticks);
65 private void EST (TimeZone t1)
67 // It could be EST though...
68 //AssertEquals("B01", "Eastern Standard Time", t1.StandardName);
69 //AssertEquals("B02", "Eastern Daylight Time", t1.DaylightName);
71 DaylightTime d1 = t1.GetDaylightChanges (2002);
72 AssertEquals("B03", "04/07/2002 02:00:00", d1.Start.ToString ("G"));
73 AssertEquals("B04", "10/27/2002 02:00:00", d1.End.ToString ("G"));
74 AssertEquals("B05", 36000000000L, d1.Delta.Ticks);
76 DaylightTime d2 = t1.GetDaylightChanges (1996);
77 AssertEquals("B06", "04/07/1996 02:00:00", d2.Start.ToString ("G"));
78 AssertEquals("B07", "10/27/1996 02:00:00", d2.End.ToString ("G"));
79 AssertEquals("B08", 36000000000L, d2.Delta.Ticks);
81 DateTime d3 = new DateTime (2002,2,25);
82 AssertEquals("B09", false, t1.IsDaylightSavingTime (d3));
83 DateTime d4 = new DateTime (2002,4,8);
84 AssertEquals("B10", true, t1.IsDaylightSavingTime (d4));
85 DateTime d5 = new DateTime (2002,11,4);
86 AssertEquals("B11", false, t1.IsDaylightSavingTime (d5));
88 AssertEquals("B12", -180000000000L, t1.GetUtcOffset (d3).Ticks);
89 AssertEquals("B13", -144000000000L, t1.GetUtcOffset (d4).Ticks);
90 AssertEquals("B14", -180000000000L, t1.GetUtcOffset (d5).Ticks);
93 private void TST (TimeZone t1)
95 AssertEquals("C01", "Tokyo Standard Time", t1.StandardName);
96 AssertEquals("C02", "Tokyo Standard Time", t1.DaylightName);
98 DateTime d3 = new DateTime (2002,2,25);
99 AssertEquals("C09", false, t1.IsDaylightSavingTime (d3));
100 DateTime d4 = new DateTime (2002,4,8);
101 AssertEquals("C10", false, t1.IsDaylightSavingTime (d4));
102 DateTime d5 = new DateTime (2002,11,4);
103 AssertEquals("C11", false, t1.IsDaylightSavingTime (d5));
105 AssertEquals("C12", 324000000000L, t1.GetUtcOffset (d3).Ticks);
106 AssertEquals("C13", 324000000000L, t1.GetUtcOffset (d4).Ticks);
107 AssertEquals("C14", 324000000000L, t1.GetUtcOffset (d5).Ticks);
110 private void GMT (TimeZone t1) {
111 // Probably wont work on MS.NET, but is better than nothing. Where do
112 // we change our implementation to match theirs?
114 AssertEquals("D01", "GMT", t1.StandardName);
115 AssertEquals("D02", "BST", t1.DaylightName);
117 DaylightTime d1 = t1.GetDaylightChanges (2002);
118 AssertEquals("D03", "03/31/2002 01:00:00", d1.Start.ToString ("G"));
119 AssertEquals("D04", "10/27/2002 02:00:00", d1.End.ToString ("G"));
120 AssertEquals("D05", 36000000000L, d1.Delta.Ticks);
122 DaylightTime d2 = t1.GetDaylightChanges (1996);
123 AssertEquals("D06", "03/31/1996 01:00:00", d2.Start.ToString ("G"));
124 AssertEquals("D07", "10/27/1996 02:00:00", d2.End.ToString ("G"));
125 AssertEquals("D08", 36000000000L, d2.Delta.Ticks);
127 DateTime d3 = new DateTime (2002,2,25);
128 AssertEquals("D09", false, t1.IsDaylightSavingTime (d3));
129 DateTime d4 = new DateTime (2002,4,2);
130 AssertEquals("D10", true, t1.IsDaylightSavingTime (d4));
131 DateTime d5 = new DateTime (2002,11,4);
132 AssertEquals("D11", false, t1.IsDaylightSavingTime (d5));
134 AssertEquals("D12", 0L, t1.GetUtcOffset (d3).Ticks);
135 AssertEquals("D13", 36000000000L, t1.GetUtcOffset (d4).Ticks);
136 AssertEquals("D14", 0L, t1.GetUtcOffset (d5).Ticks);
141 public void TestCtors ()
143 TimeZone t1 = TimeZone.CurrentTimeZone;
144 switch (t1.StandardName) {
148 case "Eastern Standard Time":
152 case "Tokyo Standard Time":
159 NUnit.Framework.Assert.Ignore ("Your time zone (" + t1.StandardName + ") isn't defined in the test case");
165 [Category ("TargetJvmNotWorking")]
166 public void CurrentTimeZone_SerializationRoundtrip ()
168 TimeZone tz = TimeZone.CurrentTimeZone;
169 BinaryFormatter bf = new BinaryFormatter ();
170 MemoryStream ms = new MemoryStream ();
171 bf.Serialize (ms, tz);
174 TimeZone clone = (TimeZone) bf.Deserialize (ms);
176 AssertEquals ("DaylightName", tz.DaylightName, clone.DaylightName);
177 AssertEquals ("StandardName", tz.StandardName, clone.StandardName);
180 static private byte[] serialized_timezone = {
182 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00,
183 0x1C, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x54,
184 0x69, 0x6D, 0x65, 0x5A, 0x6F, 0x6E, 0x65, 0x04, 0x00, 0x00, 0x00, 0x17, 0x6D, 0x5F, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x44, 0x61,
185 0x79, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x73, 0x0D, 0x6D, 0x5F, 0x74, 0x69, 0x63, 0x6B, 0x73, 0x4F,
186 0x66, 0x66, 0x73, 0x65, 0x74, 0x0E, 0x6D, 0x5F, 0x73, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64, 0x4E, 0x61, 0x6D, 0x65, 0x0E, 0x6D,
187 0x5F, 0x64, 0x61, 0x79, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x03, 0x00, 0x01, 0x01, 0x1C, 0x53, 0x79, 0x73, 0x74,
188 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E, 0x48, 0x61, 0x73, 0x68, 0x74, 0x61, 0x62,
189 0x6C, 0x65, 0x09, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x29, 0x17, 0xD6, 0xFF, 0xFF, 0xFF, 0x06, 0x03, 0x00, 0x00, 0x00, 0x15,
190 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6E, 0x20, 0x53, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x0A,
191 0x04, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F,
192 0x6E, 0x73, 0x2E, 0x48, 0x61, 0x73, 0x68, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x07, 0x00, 0x00, 0x00, 0x0A, 0x4C, 0x6F, 0x61, 0x64, 0x46,
193 0x61, 0x63, 0x74, 0x6F, 0x72, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x08, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x72, 0x65, 0x72,
194 0x10, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6F, 0x64, 0x65, 0x50, 0x72, 0x6F, 0x76, 0x69, 0x64, 0x65, 0x72, 0x08, 0x48, 0x61, 0x73, 0x68,
195 0x53, 0x69, 0x7A, 0x65, 0x04, 0x4B, 0x65, 0x79, 0x73, 0x06, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x73, 0x00, 0x00, 0x03, 0x03, 0x00, 0x05,
196 0x05, 0x0B, 0x08, 0x1C, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73,
197 0x2E, 0x49, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x72, 0x65, 0x72, 0x24, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C,
198 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E, 0x49, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6F, 0x64, 0x65, 0x50, 0x72, 0x6F, 0x76, 0x69,
199 0x64, 0x65, 0x72, 0x08, 0xEC, 0x51, 0x38, 0x3F, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x0B, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00,
200 0x00, 0x09, 0x05, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x08, 0xCC, 0x07, 0x00, 0x00, 0x08,
201 0x08, 0xD5, 0x07, 0x00, 0x00, 0x08, 0x08, 0xD2, 0x07, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x06,
202 0x00, 0x00, 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x09, 0x08, 0x00, 0x00, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x21, 0x53, 0x79, 0x73,
203 0x74, 0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x44, 0x61, 0x79, 0x6C,
204 0x69, 0x67, 0x68, 0x74, 0x54, 0x69, 0x6D, 0x65, 0x03, 0x00, 0x00, 0x00, 0x07, 0x6D, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x05, 0x6D,
205 0x5F, 0x65, 0x6E, 0x64, 0x07, 0x6D, 0x5F, 0x64, 0x65, 0x6C, 0x74, 0x61, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0C, 0x00, 0x10, 0xFA, 0x0F,
206 0x3D, 0xF2, 0xBC, 0x88, 0x00, 0x50, 0xD5, 0xB1, 0xC1, 0x91, 0xBD, 0x88, 0x00, 0x68, 0xC4, 0x61, 0x08, 0x00, 0x00, 0x00, 0x01, 0x07,
207 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x50, 0x23, 0xFA, 0x07, 0x06, 0xC7, 0x88, 0x00, 0xD0, 0xE2, 0xC4, 0x0C, 0xAB, 0xC7,
208 0x88, 0x00, 0x68, 0xC4, 0x61, 0x08, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x50, 0x0C, 0x0F,
209 0xEF, 0xAB, 0xC3, 0x88, 0x00, 0x90, 0xE7, 0xB0, 0x73, 0x4B, 0xC4, 0x88, 0x00, 0x68, 0xC4, 0x61, 0x08, 0x00, 0x00, 0x00, 0x0B
211 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00,
212 0x1C, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x54,
213 0x69, 0x6D, 0x65, 0x5A, 0x6F, 0x6E, 0x65, 0x04, 0x00, 0x00, 0x00, 0x17, 0x6D, 0x5F, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x44, 0x61,
214 0x79, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x73, 0x0D, 0x6D, 0x5F, 0x74, 0x69, 0x63, 0x6B, 0x73, 0x4F,
215 0x66, 0x66, 0x73, 0x65, 0x74, 0x0E, 0x6D, 0x5F, 0x73, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64, 0x4E, 0x61, 0x6D, 0x65, 0x0E, 0x6D,
216 0x5F, 0x64, 0x61, 0x79, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x03, 0x00, 0x01, 0x01, 0x1C, 0x53, 0x79, 0x73, 0x74,
217 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E, 0x48, 0x61, 0x73, 0x68, 0x74, 0x61, 0x62,
218 0x6C, 0x65, 0x09, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x29, 0x17, 0xD6, 0xFF, 0xFF, 0xFF, 0x06, 0x03, 0x00, 0x00, 0x00, 0x15,
219 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6E, 0x20, 0x53, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x0A,
220 0x04, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F,
221 0x6E, 0x73, 0x2E, 0x48, 0x61, 0x73, 0x68, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x07, 0x00, 0x00, 0x00, 0x0A, 0x4C, 0x6F, 0x61, 0x64, 0x46,
222 0x61, 0x63, 0x74, 0x6F, 0x72, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x08, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x72, 0x65, 0x72,
223 0x10, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6F, 0x64, 0x65, 0x50, 0x72, 0x6F, 0x76, 0x69, 0x64, 0x65, 0x72, 0x08, 0x48, 0x61, 0x73, 0x68,
224 0x53, 0x69, 0x7A, 0x65, 0x04, 0x4B, 0x65, 0x79, 0x73, 0x06, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x73, 0x00, 0x00, 0x03, 0x03, 0x00, 0x05,
225 0x05, 0x0B, 0x08, 0x1C, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73,
226 0x2E, 0x49, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x72, 0x65, 0x72, 0x24, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C,
227 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E, 0x49, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6F, 0x64, 0x65, 0x50, 0x72, 0x6F, 0x76, 0x69,
228 0x64, 0x65, 0x72, 0x08, 0xEC, 0x51, 0x38, 0x3F, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x0B, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00,
229 0x00, 0x09, 0x05, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x08, 0xCC, 0x07, 0x00, 0x00, 0x08,
230 0x08, 0xD2, 0x07, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x06, 0x00, 0x00, 0x00, 0x09, 0x07, 0x00,
231 0x00, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x21, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x69,
232 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x44, 0x61, 0x79, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x54, 0x69, 0x6D, 0x65, 0x03, 0x00, 0x00,
233 0x00, 0x07, 0x6D, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x05, 0x6D, 0x5F, 0x65, 0x6E, 0x64, 0x07, 0x6D, 0x5F, 0x64, 0x65, 0x6C, 0x74,
234 0x61, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0C, 0x00, 0x10, 0xFA, 0x0F, 0x3D, 0xF2, 0xBC, 0x08, 0x00, 0x50, 0xD5, 0xB1, 0xC1, 0x91, 0xBD,
235 0x08, 0x00, 0x68, 0xC4, 0x61, 0x08, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x50, 0x0C, 0x0F,
236 0xEF, 0xAB, 0xC3, 0x08, 0x00, 0x90, 0xE7, 0xB0, 0x73, 0x4B, 0xC4, 0x08, 0x00, 0x68, 0xC4, 0x61, 0x08, 0x00, 0x00, 0x00, 0x0B
241 [Category ("NotWorking")]
242 // 1.x - deserialize but strings are null
243 // 2.x - eexception when creating a datetime with a negative value
244 public void DeserializeKnownValue ()
246 MemoryStream ms = new MemoryStream (serialized_timezone);
247 BinaryFormatter bf = new BinaryFormatter ();
248 TimeZone tz = (TimeZone) bf.Deserialize (ms);
249 AssertEquals ("DaylightName", "Eastern Daylight Time", tz.DaylightName);
250 AssertEquals ("StandardName", "Eastern Standard Time", tz.StandardName);
254 public void ToLocalTimeAtDSTBoundaries ()
256 TimeZone tz = TimeZone.CurrentTimeZone;
257 DateTime dst_start_utc = tz.GetDaylightChanges(2007).Start.ToUniversalTime ();
259 if (dst_start_utc == DateTime.MinValue)
261 Assert ("0:1:59 < 0:3:00", tz.ToLocalTime (dst_start_utc.Subtract (new TimeSpan (0, 1, 0))) < tz.ToLocalTime (dst_start_utc));
262 Assert ("0:3:00 < 0:3:01", tz.ToLocalTime (dst_start_utc) < tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (0, 1, 0))));
263 Assert ("0:3:01 < 0:3:59", tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (0, 1, 0))) < tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (0, 59, 0))));
264 Assert ("0:3:59 < 0:4:00", tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (0, 59, 0))) < tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (1, 0, 0))));
265 Assert ("0:4:00 < 0:4:01", tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (1, 0, 0))) < tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (1, 1, 0))));