2 // DateTimeTest.cs - NUnit Test Cases for the System.DateTime struct
5 // Martin Baulig (martin@gnome.org)
7 // (C) 2002 Free Software Foundation
8 // Copyright (C) 2004 Novell (http://www.novell.com)
11 using NUnit.Framework;
14 using System.Threading;
15 using System.Globalization;
17 namespace MonoTests.System
21 public class DateTimeTest : Assertion
24 internal enum Resolution : ushort {
40 internal void DTAssertEquals (DateTime actual, DateTime expected, Resolution resolution) {
41 DTAssertEquals ("", actual, expected, resolution);
44 internal void DTAssertEquals (string message, DateTime expected, DateTime actual, Resolution resolution) {
45 if ((resolution & Resolution.Year) != 0)
46 AssertEquals (message, expected.Year, actual.Year);
47 if ((resolution & Resolution._Month) != 0)
48 AssertEquals (message, expected.Month, actual.Month);
49 if ((resolution & Resolution._Day) != 0)
50 AssertEquals (message, expected.Day, actual.Day);
51 if ((resolution & Resolution._Hour) != 0)
52 AssertEquals (message, expected.Hour, actual.Hour);
53 if ((resolution & Resolution._Minute) != 0)
54 AssertEquals (message, expected.Minute, actual.Minute);
55 if ((resolution & Resolution._Second) != 0)
56 AssertEquals (message, expected.Second, actual.Second);
57 if ((resolution & Resolution._Millisecond) != 0)
58 AssertEquals (message, expected.Millisecond, actual.Millisecond);
61 private CultureInfo oldcult;
64 631501920000000000L, // 25 Feb 2002 - 00:00:00
65 631502475130080000L, // 25 Feb 2002 - 15:25:13,8
66 631502115130080000L, // 25 Feb 2002 - 05:25:13,8
67 631502115000000000L, // 25 Feb 2002 - 05:25:00
68 631502115130000000L, // 25 Feb 2002 - 05:25:13
69 631502079130000000L, // 25 Feb 2002 - 04:25:13
70 629197085770000000L // 06 Nov 1994 - 08:49:37
73 public DateTimeTest() {}
78 // the current culture determines the result of formatting
79 oldcult = Thread.CurrentThread.CurrentCulture;
80 Thread.CurrentThread.CurrentCulture = new CultureInfo ("");
84 public void TearDown ()
86 Thread.CurrentThread.CurrentCulture = oldcult;
90 public void TestCtors ()
92 DateTime t1 = new DateTime (2002,2,25);
93 AssertEquals("A01", myTicks[0], t1.Ticks);
94 DateTime t2 = new DateTime (2002,2,25,15,25,13,8);
95 AssertEquals("A02", myTicks[1], t2.Ticks);
96 AssertEquals("A03", myTicks[0], t2.Date.Ticks);
97 AssertEquals("A04", 2002, t2.Year);
98 AssertEquals("A05", 2, t2.Month);
99 AssertEquals("A06", 25, t2.Day);
100 AssertEquals("A07", 15, t2.Hour);
101 AssertEquals("A08", 25, t2.Minute);
102 AssertEquals("A09", 13, t2.Second);
103 AssertEquals("A10", 8, t2.Millisecond);
104 DateTime t3 = new DateTime (2002,2,25,5,25,13,8);
105 AssertEquals("A11", myTicks[2], t3.Ticks);
109 public void Constructor_Max ()
111 AssertEquals ("Max", 3155378975999990000, new DateTime (9999, 12, 31, 23, 59, 59, 999).Ticks);
115 [ExpectedException (typeof (ArgumentOutOfRangeException))]
116 public void Constructor_Milliseconds_Negative ()
118 new DateTime (9999, 12, 31, 23, 59, 59, -1);
122 [ExpectedException (typeof (ArgumentOutOfRangeException))]
123 public void Constructor_Milliseconds_1000 ()
125 new DateTime (9999, 12, 31, 23, 59, 59, 1000);
129 public void Fields ()
131 AssertEquals ("J01", 3155378975999999999L, DateTime.MaxValue.Ticks);
132 AssertEquals ("J02", 0, DateTime.MinValue.Ticks);
138 DateTime t1 = new DateTime (myTicks [1]);
139 TimeSpan span = new TimeSpan (3, 54, 1);
140 DateTime t2 = t1.Add (span);
142 AssertEquals ("K01", 25, t2.Day);
143 AssertEquals ("K02", 19, t2.Hour);
144 AssertEquals ("K03", 19, t2.Minute);
145 AssertEquals ("K04", 14, t2.Second);
147 AssertEquals ("K05", 25, t1.Day);
148 AssertEquals ("K06", 15, t1.Hour);
149 AssertEquals ("K07", 25, t1.Minute);
150 AssertEquals ("K08", 13, t1.Second);
154 [ExpectedException(typeof (ArgumentOutOfRangeException))]
155 public void AddOutOfRangeException1 ()
157 DateTime t1 = new DateTime (myTicks [1]);
158 t1.Add (TimeSpan.MaxValue);
162 [ExpectedException(typeof (ArgumentOutOfRangeException))]
163 public void AddOutOfRangeException2 ()
165 DateTime t1 = new DateTime (myTicks [1]);
166 t1.Add (TimeSpan.MinValue);
170 public void AddDays ()
172 DateTime t1 = new DateTime (myTicks [1]);
174 AssertEquals ("L01", 28, t1.Day);
175 AssertEquals ("L02", 15, t1.Hour);
176 AssertEquals ("L03", 25, t1.Minute);
177 AssertEquals ("L04", 13, t1.Second);
179 t1 = t1.AddDays (1.9);
180 AssertEquals ("L05", 2, t1.Day);
181 AssertEquals ("L06", 13, t1.Hour);
182 AssertEquals ("L07", 1, t1.Minute);
183 AssertEquals ("L08", 13, t1.Second);
185 t1 = t1.AddDays (0.2);
186 AssertEquals ("L09", 2, t1.Day);
187 AssertEquals ("L10", 17, t1.Hour);
188 AssertEquals ("L11", 49, t1.Minute);
189 AssertEquals ("L12", 13, t1.Second);
193 [ExpectedException(typeof (ArgumentOutOfRangeException))]
194 public void AddDaysOutOfRangeException1 ()
196 DateTime t1 = new DateTime (myTicks [1]);
197 t1.AddDays (10000000);
201 [ExpectedException(typeof (ArgumentOutOfRangeException))]
202 public void AddDaysOutOfRangeException2 ()
204 DateTime t1 = new DateTime (myTicks [1]);
205 t1.AddDays (-10000000);
209 public void AddHours ()
211 DateTime t1 = new DateTime (myTicks [1]);
212 t1 = t1.AddHours (10);
213 AssertEquals ("N01", 26, t1.Day);
214 AssertEquals ("N02", 1, t1.Hour);
215 AssertEquals ("N03", 25, t1.Minute);
216 AssertEquals ("N04", 13, t1.Second);
218 t1 = t1.AddHours (-3.7);
219 AssertEquals ("N05", 25, t1.Day);
220 AssertEquals ("N06", 21, t1.Hour);
221 AssertEquals ("N07", 43, t1.Minute);
222 AssertEquals ("N08", 13, t1.Second);
224 t1 = t1.AddHours (3.732);
225 AssertEquals ("N09", 26, t1.Day);
226 AssertEquals ("N10", 1, t1.Hour);
227 AssertEquals ("N11", 27, t1.Minute);
228 AssertEquals ("N12", 8, t1.Second);
232 [ExpectedException (typeof (ArgumentOutOfRangeException))]
233 public void AddHoursOutOfRangeException1 ()
235 DateTime t1 = new DateTime (myTicks [1]);
240 [ExpectedException (typeof (ArgumentOutOfRangeException))]
241 public void AddHoursOutOfRangeException2 ()
243 DateTime t1 = new DateTime (myTicks [1]);
244 t1.AddHours (-9E100);
248 public void AddMilliseconds ()
250 DateTime t1 = new DateTime (myTicks [1]);
251 t1 = t1.AddMilliseconds (1E10);
252 AssertEquals ("O01", 21, t1.Day);
253 AssertEquals ("O02", 9, t1.Hour);
254 AssertEquals ("O03", 11, t1.Minute);
255 AssertEquals ("O04", 53, t1.Second);
257 t1 = t1.AddMilliseconds (-19E10);
258 AssertEquals ("O05", 13, t1.Day);
259 AssertEquals ("O06", 7, t1.Hour);
260 AssertEquals ("O07", 25, t1.Minute);
261 AssertEquals ("O08", 13, t1.Second);
263 t1 = t1.AddMilliseconds (15.623);
264 AssertEquals ("O09", 13, t1.Day);
265 AssertEquals ("O10", 7, t1.Hour);
266 AssertEquals ("O11", 25, t1.Minute);
267 AssertEquals ("O12", 13, t1.Second);
271 [ExpectedException (typeof (ArgumentOutOfRangeException))]
272 public void AddMillisecondsOutOfRangeException1 ()
274 DateTime t1 = new DateTime (myTicks [1]);
275 t1.AddMilliseconds (9E100);
279 [ExpectedException (typeof (ArgumentOutOfRangeException))]
280 public void AddMillisecondsOutOfRangeException2 ()
282 DateTime t1 = new DateTime (myTicks [1]);
283 t1.AddMilliseconds (-9E100);
287 public void TestToString ()
289 DateTime t1 = new DateTime (myTicks[2]);
290 DateTime t2 = new DateTime (myTicks[1]);
292 AssertEquals("B01", "02/25/2002", t1.ToString ("d"));
293 AssertEquals("B02", "Monday, 25 February 2002", t1.ToString ("D"));
294 AssertEquals("B03", "Monday, 25 February 2002 05:25", t1.ToString ("f"));
295 AssertEquals("B04", "Monday, 25 February 2002 05:25:13", t1.ToString ("F"));
296 AssertEquals("B05", "02/25/2002 05:25", t1.ToString ("g"));
297 AssertEquals("B06", "02/25/2002 05:25:13", t1.ToString ("G"));
298 AssertEquals("B07", "February 25", t1.ToString ("m"));
299 AssertEquals("B08", "February 25", t1.ToString ("M"));
300 AssertEquals("B09", "Mon, 25 Feb 2002 05:25:13 GMT", t1.ToString ("r"));
301 AssertEquals("B10", "Mon, 25 Feb 2002 05:25:13 GMT", t1.ToString ("R"));
302 AssertEquals("B11", "2002-02-25T05:25:13", t1.ToString ("s"));
303 AssertEquals("B12", "05:25", t1.ToString ("t"));
304 AssertEquals("B13", "05:25:13", t1.ToString ("T"));
305 AssertEquals("B14", "2002-02-25 05:25:13Z", t1.ToString ("u"));
306 // FIXME: this test is timezone dependent
307 // AssertEquals("B15", "Sunday, 24 February 2002 11:25:13", t1.ToString ("U"));
308 AssertEquals("B16", "2002 February", t1.ToString ("y"));
309 AssertEquals("B17", "2002 February", t1.ToString ("Y"));
312 AssertEquals("C01", "25", t1.ToString ("%d"));
313 AssertEquals("C02", "25", t1.ToString ("dd"));
314 AssertEquals("C03", "Mon", t1.ToString ("ddd"));
315 AssertEquals("C04", "Monday", t1.ToString ("dddd"));
316 AssertEquals("C05", "2", t1.ToString ("%M"));
317 AssertEquals("C06", "02", t1.ToString ("MM"));
318 AssertEquals("C07", "Feb", t1.ToString ("MMM"));
319 AssertEquals("C08", "February", t1.ToString ("MMMM"));
320 AssertEquals("C09", "2", t1.ToString ("%y"));
321 AssertEquals("C10", "02", t1.ToString ("yy"));
322 AssertEquals("C11", "2002", t1.ToString ("yyyy"));
323 AssertEquals("C12", "5", t1.ToString ("%h"));
324 AssertEquals("C13", "05", t1.ToString ("hh"));
325 AssertEquals("C14", "3", t2.ToString ("%h"));
326 AssertEquals("C15", "03", t2.ToString ("hh"));
327 AssertEquals("C16", "15", t2.ToString ("%H"));
328 AssertEquals("C17", "15", t2.ToString ("HH"));
329 AssertEquals("C18", "25", t2.ToString ("%m"));
330 AssertEquals("C19", "25", t2.ToString ("mm"));
331 AssertEquals("C20", "13", t2.ToString ("%s"));
332 AssertEquals("C21", "13", t2.ToString ("ss"));
333 AssertEquals("C22", "A", t1.ToString ("%t"));
334 AssertEquals("C23", "P", t2.ToString ("%t"));
335 AssertEquals("C24", "AM", t1.ToString ("tt"));
336 AssertEquals("C25", "PM", t2.ToString ("tt"));
337 long offset = TimeZone.CurrentTimeZone.GetUtcOffset(t1).Ticks / 36000000000;
338 // Must specify '+0' for GMT
339 AssertEquals("C26", offset.ToString("+#;-#;+0"), t1.ToString ("%z"));
340 AssertEquals("C27", offset.ToString("+00;-00;+00"), t1.ToString ("zz"));
341 // This does not work in, eg banglore, because their timezone has an offset of
343 //AssertEquals("C28", offset.ToString("+00;-00;00") + ":00", t1.ToString ("zzz"));
344 AssertEquals("C29", " : ", t1.ToString (" : "));
345 AssertEquals("C30", " / ", t1.ToString (" / "));
346 AssertEquals("C31", " yyy ", t1.ToString (" 'yyy' "));
347 AssertEquals("C32", " d", t1.ToString (" \\d"));
351 public void TestParseExact3 ()
353 DateTime t1 = DateTime.ParseExact ("2002-02-25 04:25:13Z", "u", null);
354 t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1);
355 AssertEquals ("D07a", 2002, t1.Year);
356 AssertEquals ("D07b", 02, t1.Month);
357 // FIXME: This test is timezone dependent.
358 // AssertEquals ("D07c", 25, t1.Day);
359 // AssertEquals ("D07d", 04, t1.Hour);
360 AssertEquals ("D07e", 25, t1.Minute);
361 AssertEquals ("D07f", 13, t1.Second);
365 public void TestParseExact4 ()
367 // bug #60912, modified hour as 13:00
368 string s = "6/28/2004 13:00:00 AM";
369 string f = "M/d/yyyy HH':'mm':'ss tt";
370 DateTime.ParseExact (s, f, CultureInfo.InvariantCulture);
373 DateTime.ParseExact ("Wed, 12 May 2004 20:51:09 +0200",
374 @"ddd, d MMM yyyy H:m:s zzz",
375 CultureInfo.CreateSpecificCulture("en-us"),
376 DateTimeStyles.AllowInnerWhite);
380 public void TestParseExact ()
383 DateTime t1 = DateTime.ParseExact ("02/25/2002", "d", null);
384 AssertEquals ("D01", myTicks[0], t1.Ticks);
385 t1 = DateTime.ParseExact ("Monday, 25 February 2002", "D", null);
386 AssertEquals ("D02", myTicks[0], t1.Ticks);
387 t1 = DateTime.ParseExact ("Monday, 25 February 2002 05:25", "f", null);
388 AssertEquals ("D03", myTicks[3], t1.Ticks);
389 t1 = DateTime.ParseExact ("Monday, 25 February 2002 05:25:13", "F", null);
390 AssertEquals ("D04", myTicks[4], t1.Ticks);
391 t1 = DateTime.ParseExact ("02/25/2002 05:25", "g", null);
392 AssertEquals ("D05", myTicks[3], t1.Ticks);
393 t1 = DateTime.ParseExact ("02/25/2002 05:25:13", "G", null);
394 AssertEquals ("D06", myTicks[4], t1.Ticks);
395 t1 = DateTime.ParseExact ("Monday, 25 February 2002 04:25:13", "U", null);
396 t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1);
397 AssertEquals ("D08a", 2002, t1.Year);
398 AssertEquals ("D08b", 02, t1.Month);
399 AssertEquals ("D08c", 25, t1.Day);
400 AssertEquals ("D08d", 04, t1.Hour);
401 AssertEquals ("D08e", 25, t1.Minute);
402 AssertEquals ("D08f", 13, t1.Second);
404 DateTime t2 = new DateTime (DateTime.Today.Year, 2, 25);
405 t1 = DateTime.ParseExact ("February 25", "m", null);
406 AssertEquals ("D09", t2.Ticks, t1.Ticks);
408 t2 = new DateTime (DateTime.Today.Year, 2, 25);
409 t1 = DateTime.ParseExact ("February 25", "M", null);
410 AssertEquals ("D10", t2.Ticks, t1.Ticks);
412 t1 = DateTime.ParseExact ("Mon, 25 Feb 2002 04:25:13 GMT", "r", null);
413 AssertEquals ("D11a", 2002, t1.Year);
414 AssertEquals ("D11b", 02, t1.Month);
415 AssertEquals ("D11c", 25, t1.Day);
416 AssertEquals ("D11d", 04, t1.Hour);
417 AssertEquals ("D11e", 25, t1.Minute);
418 AssertEquals ("D11f", 13, t1.Second);
420 t1 = DateTime.ParseExact ("Mon, 25 Feb 2002 04:25:13 GMT", "R", null);
421 AssertEquals ("D12a", 2002, t1.Year);
422 AssertEquals ("D12b", 02, t1.Month);
423 AssertEquals ("D12c", 25, t1.Day);
424 AssertEquals ("D12d", 04, t1.Hour);
425 AssertEquals ("D12e", 25, t1.Minute);
426 AssertEquals ("D12f", 13, t1.Second);
428 t1 = DateTime.ParseExact ("2002-02-25T05:25:13", "s", null);
429 AssertEquals ("D13", myTicks[4], t1.Ticks);
431 t2 = DateTime.Today + new TimeSpan (5,25,0);
432 t1 = DateTime.ParseExact ("05:25", "t", null);
433 AssertEquals("D14", t2.Ticks, t1.Ticks);
435 t2 = DateTime.Today + new TimeSpan (5,25,13);
436 t1 = DateTime.ParseExact ("05:25:13", "T", null);
437 AssertEquals("D15", t2.Ticks, t1.Ticks);
439 t2 = new DateTime (2002, 2, 1);
440 t1 = DateTime.ParseExact ("2002 February", "y", null);
441 AssertEquals ("D16", t2.Ticks, t1.Ticks);
443 t2 = new DateTime (2002, 2, 1);
444 t1 = DateTime.ParseExact ("2002 February", "Y", null);
445 AssertEquals ("D16", t2.Ticks, t1.Ticks);
448 t2 = new DateTime (DateTime.Now.Year, 1, 25);
449 t1 = DateTime.ParseExact ("25", "%d", null);
450 AssertEquals ("E01: " + t2 + " -- " + t1, t2.Ticks, t1.Ticks);
451 t1 = DateTime.ParseExact ("25", "dd", null);
452 AssertEquals ("E02", t2.Ticks, t1.Ticks);
454 t2 = new DateTime (DateTime.Today.Year, 2, 1);
455 t1 = DateTime.ParseExact ("2", "%M", null);
456 AssertEquals ("E03", t2.Ticks, t1.Ticks);
457 t1 = DateTime.ParseExact ("02", "MM", null);
458 AssertEquals ("E04", t2.Ticks, t1.Ticks);
459 t1 = DateTime.ParseExact ("Feb", "MMM", null);
460 AssertEquals ("E05", t2.Ticks, t1.Ticks);
461 t1 = DateTime.ParseExact ("February", "MMMM", null);
462 AssertEquals ("E06", t2.Ticks, t1.Ticks);
464 t2 = new DateTime (2005, 1, 1);
465 t1 = DateTime.ParseExact ("5", "%y", null);
466 AssertEquals ("E07", t2.Ticks, t1.Ticks);
467 t1 = DateTime.ParseExact ("05", "yy", null);
468 AssertEquals ("E08", t2.Ticks, t1.Ticks);
469 t1 = DateTime.ParseExact ("2005", "yyyy", null);
470 AssertEquals ("E09", t2.Ticks, t1.Ticks);
472 t2 = DateTime.Today + new TimeSpan (5, 0, 0);
473 t1 = DateTime.ParseExact ("5A", "ht", null);
474 AssertEquals ("E10", t2.Ticks, t1.Ticks);
475 t1 = DateTime.ParseExact ("05A", "hht", null);
476 AssertEquals ("E11", t2.Ticks, t1.Ticks);
478 t2 = DateTime.Today + new TimeSpan (15, 0, 0);
479 t1 = DateTime.ParseExact ("3P", "ht", null);
480 AssertEquals ("E12", t2.Ticks, t1.Ticks);
481 t1 = DateTime.ParseExact ("03P", "hht", null);
482 AssertEquals ("E13", t2.Ticks, t1.Ticks);
484 t2 = DateTime.Today + new TimeSpan (5, 0, 0);
485 t1 = DateTime.ParseExact ("5", "%H", null);
486 AssertEquals ("E14", t2.Ticks, t1.Ticks);
488 t2 = DateTime.Today + new TimeSpan (15, 0, 0);
489 t1 = DateTime.ParseExact ("15", "%H", null);
490 AssertEquals ("E15", t2.Ticks, t1.Ticks);
491 t1 = DateTime.ParseExact ("15", "HH", null);
492 AssertEquals ("E16", t2.Ticks, t1.Ticks);
496 // Fails durring DST for msft and mono
497 t2 = DateTime.Today + new TimeSpan (17, 18, 0);
498 t1 = DateTime.ParseExact ("11:18AM -5", "h:mmtt z", null);
499 t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1);
500 if (!TimeZone.CurrentTimeZone.IsDaylightSavingTime(t1))
501 t1 += new TimeSpan(1, 0, 0);
502 AssertEquals ("F01", t2.Ticks, t1.Ticks);
504 t1 = DateTime.ParseExact ("11:18AM -05:00", "h:mmtt zzz", null);
505 t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1);
506 if (!TimeZone.CurrentTimeZone.IsDaylightSavingTime(t1))
507 t1 += new TimeSpan(1, 0, 0);
508 AssertEquals ("F02", t2.Ticks, t1.Ticks);
510 t1 = DateTime.ParseExact ("7:18PM +03", "h:mmtt zz", null);
511 t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1);
512 if (!TimeZone.CurrentTimeZone.IsDaylightSavingTime(t1))
513 t1 += new TimeSpan(1, 0, 0);
514 AssertEquals ("F03", t2.Ticks, t1.Ticks);
516 t1 = DateTime.ParseExact ("7:48PM +03:30", "h:mmtt zzz", null);
517 t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1);
518 if (!TimeZone.CurrentTimeZone.IsDaylightSavingTime(t1))
519 t1 += new TimeSpan(1, 0, 0);
520 AssertEquals ("F04", t2.Ticks, t1.Ticks);
524 t2 = DateTime.Today + new TimeSpan (16, 18, 0);
525 t1 = DateTime.ParseExact ("11:18AM -5", "h:mmtt z",
526 null, DateTimeStyles.AdjustToUniversal);
527 AssertEquals ("G01", t2.Ticks, t1.Ticks);
529 t1 = DateTime.ParseExact ("Monday, 25 February 2002 05:25:13", "F",
530 null, DateTimeStyles.AdjustToUniversal);
531 AssertEquals ("G02", myTicks[4], t1.Ticks);
532 t1 = DateTime.ParseExact ("Monday, 25 February 2002 05:25:13",
533 "dddd, dd MMMM yyyy HH:mm:ss",
534 null, DateTimeStyles.AdjustToUniversal);
535 AssertEquals ("G03", myTicks[4], t1.Ticks);
537 t1 = DateTime.ParseExact ("02/25/2002", "d", null,
538 DateTimeStyles.AllowWhiteSpaces);
539 AssertEquals ("G04", myTicks[0], t1.Ticks);
541 t1 = DateTime.ParseExact (" 02/25/2002", "d", null,
542 DateTimeStyles.AllowLeadingWhite);
543 AssertEquals ("G05", myTicks[0], t1.Ticks);
545 t1 = DateTime.ParseExact ("02/25/2002 ", "d", null,
546 DateTimeStyles.AllowTrailingWhite);
547 AssertEquals ("G06", myTicks[0], t1.Ticks);
549 t1 = DateTime.ParseExact (" 02 / 25 / 2002 ", "d", null,
550 DateTimeStyles.AllowWhiteSpaces);
551 AssertEquals ("G07", myTicks[0], t1.Ticks);
553 // Multi Custom Patterns
554 string rfc1123_date = "r";
555 string rfc850_date = "dddd, dd'-'MMM'-'yy HH':'mm':'ss 'GMT'";
556 string asctime_date = "ddd MMM d HH':'mm':'ss yyyy";
557 string [] formats = new string [] {rfc1123_date, rfc850_date, asctime_date};
558 CultureInfo enUS = new CultureInfo("en-US", false);
559 t1 = DateTime.ParseExact ("Sun, 06 Nov 1994 08:49:37 GMT", formats[0], enUS,
560 DateTimeStyles.AllowWhiteSpaces);
561 AssertEquals ("M01", myTicks[6], t1.Ticks);
562 t1 = DateTime.ParseExact ("Sunday, 06-Nov-94 08:49:37 GMT", formats[1], enUS,
563 DateTimeStyles.AllowWhiteSpaces);
564 AssertEquals ("M02", myTicks[6], t1.Ticks);
565 t1 = DateTime.ParseExact ("Sun Nov 6 08:49:37 1994", formats[2], enUS,
566 DateTimeStyles.AllowWhiteSpaces);
567 AssertEquals ("M03", myTicks[6], t1.Ticks);
568 t1 = DateTime.ParseExact ("Sun, 06 Nov 1994 08:49:37 GMT", formats, enUS,
569 DateTimeStyles.AllowWhiteSpaces);
570 AssertEquals ("M04", myTicks[6], t1.Ticks);
571 t1 = DateTime.ParseExact ("Sunday, 06-Nov-94 08:49:37 GMT", formats, enUS,
572 DateTimeStyles.AllowWhiteSpaces);
573 AssertEquals ("M05", myTicks[6], t1.Ticks);
574 t1 = DateTime.ParseExact ("Sun Nov 6 08:49:37 1994", formats, enUS,
575 DateTimeStyles.AllowWhiteSpaces);
576 AssertEquals ("M06", myTicks[6], t1.Ticks);
579 t1 = DateTime.ParseExact ("--12--", "--MM--" , null);
580 AssertEquals("Dash01", 12, t1.Month);
581 t1=DateTime.ParseExact ("--12-24", "--MM-dd" , null);
582 AssertEquals("Dash02", 24, t1.Day);
583 AssertEquals("Dash03", 12, t1.Month);
584 t1=DateTime.ParseExact ("---24", "---dd" , null);
585 AssertEquals("Dash04", 24, t1.Day);
588 t1 = DateTime.ParseExact ("18Aug2004 12:33:00", "ddMMMyyyy hh:mm:ss", new CultureInfo ("en-US"));
589 AssertEquals ("hh allows 12, though it's useless", 0, t1.Hour);
592 DateTime.ParseExact ("Tue, 12 Apr 2005 10:10:04 +0100",
593 "Tue, 12 Apr 2005 10:10:04 +0100", enUS);
595 DateTime.ParseExact ("Tue, 12 Apr 2005 10:10:04 +00000",
596 "ddd, dd MMM yyyy HH':'mm':'ss zzz", enUS);
598 } catch (FormatException) {
601 // Bug #75213 : literal escaping.
602 t1 = DateTime.ParseExact ("20050707132527Z",
603 "yyyyMMddHHmmss\\Z", CultureInfo.InvariantCulture);
604 AssertEquals ("Literal1.Ticks", 632563395270000000, t1.Ticks);
608 [Ignore ("need to fix tests that run on different timezones")]
609 public void TestParse2 ()
611 DateTime t1 = DateTime.Parse ("Mon, 25 Feb 2002 04:25:13 GMT");
612 t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1);
613 AssertEquals ("H10d", 04 - TimeZone.CurrentTimeZone.GetUtcOffset(t1).Hours, t1.Hour);
618 public void TestParse ()
621 DateTime t1 = DateTime.Parse ("02/25/2002");
622 AssertEquals ("H00", myTicks[0], t1.Ticks);
624 t1 = DateTime.Parse ("02-25-2002");
626 catch (Exception e) {
627 Fail ("Unexpected exception. e=" + e);
630 t1 = DateTime.Parse ("2002-02-25");
632 catch (Exception e) {
633 Fail ("Unexpected exception. e=" + e);
635 AssertEquals ("H01", myTicks[0], t1.Ticks);
636 t1 = DateTime.Parse ("Monday, 25 February 2002");
637 AssertEquals ("H02", myTicks[0], t1.Ticks);
638 t1 = DateTime.Parse ("Monday, 25 February 2002 05:25");
639 AssertEquals ("H03", myTicks[3], t1.Ticks);
640 t1 = DateTime.Parse ("Monday, 25 February 2002 05:25:13");
641 AssertEquals ("H04", myTicks[4], t1.Ticks);
642 t1 = DateTime.Parse ("02/25/2002 05:25");
643 AssertEquals ("H05", myTicks[3], t1.Ticks);
644 t1 = DateTime.Parse ("02/25/2002 05:25:13");
645 AssertEquals ("H06", myTicks[4], t1.Ticks);
646 t1 = DateTime.Parse ("2002-02-25 04:25:13Z");
647 t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1);
648 AssertEquals ("H07a", 2002, t1.Year);
649 AssertEquals ("H07b", 02, t1.Month);
650 AssertEquals ("H07c", 25, t1.Day);
651 AssertEquals ("H07d", 04, t1.Hour);
652 AssertEquals ("H07e", 25, t1.Minute);
653 AssertEquals ("H07f", 13, t1.Second);
655 DateTime t2 = new DateTime (DateTime.Today.Year, 2, 25);
656 t1 = DateTime.Parse ("February 25");
657 AssertEquals ("H08", t2.Ticks, t1.Ticks);
659 t2 = new DateTime (DateTime.Today.Year, 2, 8);
660 t1 = DateTime.Parse ("February 08");
661 AssertEquals ("H09", t2.Ticks, t1.Ticks);
663 // parsed as UTC string
664 t1 = DateTime.Parse ("Mon, 25 Feb 2002 04:25:13 GMT");
665 t1 = TimeZone.CurrentTimeZone.ToUniversalTime (t1);
666 AssertEquals ("H10a", 2002, t1.Year);
667 AssertEquals ("H10b", 02, t1.Month);
668 AssertEquals ("H10c", 25, t1.Day);
669 AssertEquals ("H10d", 4, t1.Hour);
670 AssertEquals ("H10e", 25, t1.Minute);
671 AssertEquals ("H10f", 13, t1.Second);
673 t1 = DateTime.Parse ("2002-02-25T05:25:13");
674 AssertEquals ("H11", myTicks[4], t1.Ticks);
676 t2 = DateTime.Today + new TimeSpan (5,25,0);
677 t1 = DateTime.Parse ("05:25");
678 AssertEquals("H12", t2.Ticks, t1.Ticks);
680 t2 = DateTime.Today + new TimeSpan (5,25,13);
681 t1 = DateTime.Parse ("05:25:13");
682 AssertEquals("H13", t2.Ticks, t1.Ticks);
684 t2 = new DateTime (2002, 2, 1);
685 t1 = DateTime.Parse ("2002 February");
686 AssertEquals ("H14", t2.Ticks, t1.Ticks);
688 t2 = new DateTime (2002, 2, 1);
689 t1 = DateTime.Parse ("2002 February", new CultureInfo ("ja-JP"));
690 AssertEquals ("H15", t2.Ticks, t1.Ticks);
692 t2 = new DateTime (DateTime.Today.Year, 2, 8);
693 t1 = DateTime.Parse ("February 8");
694 AssertEquals ("H16", t2.Ticks, t1.Ticks);
697 t2 = new DateTime (2002, 2, 25, 5, 25, 22);
698 t1 = DateTime.Parse ("Monday, 25 February 2002 05:25:22",
699 new CultureInfo ("hi-IN"));
700 AssertEquals ("H17", t2.Ticks, t1.Ticks);
701 t2 = new DateTime (2002, 2, 25, 5, 25, 0);
702 t1 = DateTime.Parse ("Monday, 25 February 2002 05:25",
703 new CultureInfo ("hi-IN"));
704 AssertEquals ("H18", t2.Ticks, t1.Ticks);
706 // ASP.NET QuickStarts
707 t2 = new DateTime (2002, 10, 7, 15, 6, 0);
708 t1 = DateTime.Parse ("3:06 PM 10/7/2002");
709 AssertEquals ("H19a", t2.Ticks, t1.Ticks);
711 t2 = new DateTime (2002, 10, 7, 15, 6, 0);
712 t1 = DateTime.Parse ("3:06 pm 10/7/2002");
713 AssertEquals ("H19b", t2.Ticks, t1.Ticks);
715 t2 = new DateTime (2002, 10, 7, 3, 6, 0);
716 t1 = DateTime.Parse ("3:06 AM 10/7/2002");
717 AssertEquals ("H19c", t2.Ticks, t1.Ticks);
719 t2 = new DateTime (2002, 10, 7, 3, 6, 0);
720 t1 = DateTime.Parse ("3:06 am 10/7/2002");
721 AssertEquals ("H19d", t2.Ticks, t1.Ticks);
725 public void TestParse3 ()
727 string s = "Wednesday, 09 June 2004";
728 DateTime.ParseExact (s, "dddd, dd MMMM yyyy", CultureInfo.InvariantCulture);
730 DateTime.ParseExact (s, "dddd, dd MMMM yyyy", new CultureInfo ("ja-JP"));
731 Fail ("ja-JP culture does not support format \"dddd, dd MMMM yyyy\"");
732 } catch (FormatException) {
735 // Ok, now we can assume ParseExact() works expectedly.
737 DateTime.Parse (s, CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces);
738 DateTime.Parse (s, new CultureInfo ("ja-JP"), DateTimeStyles.AllowWhiteSpaces);
739 //DateTime.Parse (s, null); currently am not sure if it works for _every_ culture.
745 public void TestParse4 ()
750 } catch (FormatException) {
754 DateTime.Parse("1000");
756 } catch (FormatException) {
760 DateTime.Parse("8:");
762 } catch (FormatException) {
767 public void Parse_Bug71289a ()
770 DateTime.Parse ("Sat,,,,,, 01 Oct 1994 03:00:00", CultureInfo.InvariantCulture);
774 public void Parse_Bug71289b ()
777 DateTime.Parse ("Sat,,, 01,,, Oct,,, ,,,1994 03:00:00", CultureInfo.InvariantCulture);
782 [ExpectedException (typeof (FormatException))]
783 public void Parse_CommaAfterHours ()
785 // ',' after 03 is not allowed.
786 DateTime.Parse ("Sat,,, 01,,, Oct,,, ,,,1994 03,:00:00", CultureInfo.InvariantCulture);
791 public void Parse_Bug72788 ()
794 DateTime dt = DateTime.Parse ("21/02/05", new CultureInfo ("fr-FR"));
795 AssertEquals (2005, dt.Year);
796 AssertEquals (02, dt.Month);
797 AssertEquals (21, dt.Day);
801 [Category ("NotWorking")] // Mono accept this format for ALL cultures
802 public void Parse_Bug53023a ()
804 foreach (CultureInfo ci in CultureInfo.GetCultures (CultureTypes.SpecificCultures)) {
805 FormatException e = null;
807 // this fails for MOST culture under MS 1.1 SP1
808 DateTime.Parse ("8/16/2005", ci);
810 catch (FormatException fe) {
813 string c = ci.ToString ();
846 Assert (c, (e == null));
849 Assert (c, (e != null));
856 public void Parse_Bug53023b ()
858 foreach (CultureInfo ci in CultureInfo.GetCultures (CultureTypes.SpecificCultures)) {
859 DateTime.Parse ("01-Sep-05", ci);
860 DateTime.Parse ("4:35:35 AM", ci);
865 [ExpectedException (typeof (FormatException))]
866 public void Parse_DontAccept2DigitsYears ()
868 // don't allow 2 digit years where we require 4.
869 DateTime.ParseExact ("05", "yyyy", CultureInfo.InvariantCulture);
873 public void ParseCOMDependentFormat ()
876 DateTime.Parse (String.Format (
877 "{0}\u5E74{1}\u6708{2}\u65E5 {3}\u6642{4}\u5206{5}\u79D2",
878 2006, 3, 1, 15, 32, 42), new CultureInfo (""));
881 // incorrect year mark.
882 DateTime.Parse (String.Format (
883 "{0}\u4E00{1}\u6708{2}\u65E5 {3}\u6642{4}\u5206{5}\u79D2",
884 2006, 3, 1, 15, 32, 42), new CultureInfo (""));
886 } catch (FormatException) {
891 [ExpectedException(typeof (FormatException))]
892 public void ParseFormatException1 ()
894 // Following string is not a correct French date i.e.
895 // MM/dd/yyyy HH:mm:ss since it expects d/M/yyyy HH:mm:ss
896 // instead (however fr-FR accepts both MM/dd/yyyy and
897 // dd/MM/yyyy, which means that we can't just throw exceptions
899 String frDateTime = "11/13/2003 11:28:15";
900 IFormatProvider format = new CultureInfo("fr-FR", true);
901 DateTime t1 = DateTime.Parse(frDateTime, format);
904 public void TestOA ()
906 double number=5000.41443;
907 DateTime d = DateTime.FromOADate(number);
908 DTAssertEquals ("I01", d, new DateTime(1913, 9, 8, 9, 56, 46, 0), Resolution.Second);
909 AssertEquals ("I02", d.ToOADate(), number);
913 public void ParseAllowsQueerString ()
915 DateTime.Parse ("Sat,,,,,, 01 Oct 1994 03:00:00", CultureInfo.InvariantCulture);
919 public void ParseUtcNonUtc ()
921 Thread.CurrentThread.CurrentCulture = new CultureInfo ("es-ES");
926 DateTimeFormatInfo dfi = DateTimeFormatInfo.InvariantInfo;
927 s = dfi.UniversalSortableDateTimePattern;
932 long tick1 = 631789220960000000; // 2003-01-23 12:34:56 as is
933 long tick2 = TimeZone.CurrentTimeZone.ToLocalTime (new DateTime (tick1)).Ticks; // adjusted to local time
936 ci = CultureInfo.InvariantCulture;
938 d = "2003/01/23 12:34:56";
939 dt = DateTime.Parse (d, ci);
940 AssertEquals (d, tick1, dt.Ticks);
942 d = "2003/01/23 12:34:56 GMT";
943 dt = DateTime.Parse (d, ci);
944 AssertEquals (d, tick2, dt.Ticks);
946 d = "Thu, 23 Jan 2003 12:34:56 GMT";
947 dt = DateTime.ParseExact (d, s2, ci);
948 AssertEquals (d, tick1, dt.Ticks);
950 d = "2003-01-23 12:34:56Z";
951 dt = DateTime.ParseExact (d, s, ci);
952 AssertEquals (d, tick1, dt.Ticks);
954 d = "2003-01-23T12:34:56";
955 dt = DateTime.ParseExact (d, s3, ci);
956 AssertEquals (d, tick1, dt.Ticks);
958 // ja-JP ... it should be culture independent
959 ci = new CultureInfo ("ja-JP");
961 d = "2003/01/23 12:34:56";
962 dt = DateTime.Parse (d, ci);
963 AssertEquals (d, tick1, dt.Ticks);
965 d = "2003/01/23 12:34:56 GMT";
966 dt = DateTime.Parse (d, ci);
967 AssertEquals (d, tick2, dt.Ticks);
969 d = "Thu, 23 Jan 2003 12:34:56 GMT";
970 dt = DateTime.ParseExact (d, s2, ci);
971 AssertEquals (d, tick1, dt.Ticks);
973 d = "2003-01-23 12:34:56Z";
974 dt = DateTime.ParseExact (d, s, ci);
975 AssertEquals (d, tick1, dt.Ticks);
977 d = "2003-01-23T12:34:56";
978 dt = DateTime.ParseExact (d, s3, ci);
979 AssertEquals (d, tick1, dt.Ticks);
983 public void TimeZoneAdjustment ()
985 CultureInfo ci = Thread.CurrentThread.CurrentCulture;
987 Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US");
988 DateTime d1 = DateTime.ParseExact ("2004/06/30", "yyyy/MM/dd", null);
989 DateTime d2 = DateTime.ParseExact ("2004/06/30Z", "yyyy/MM/dd'Z'", null);
990 DateTime d3 = DateTime.ParseExact ("Wed, 30 Jun 2004 00:00:00 GMT", "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'", null);
991 DateTime d4 = DateTime.ParseExact ("2004-06-30 00:00:00Z", "yyyy'-'MM'-'dd HH':'mm':'ss'Z'", null);
992 StringWriter sw = new StringWriter ();
993 sw.Write ("{0} {1}", d1.Ticks, d1);
994 AssertEquals ("#1", "632241504000000000 6/30/2004 12:00:00 AM", sw.ToString ());
995 sw.GetStringBuilder ().Length = 0;
996 sw.Write ("{0} {1}", d2.Ticks, d2);
997 AssertEquals ("#2", "632241504000000000 6/30/2004 12:00:00 AM", sw.ToString ());
998 sw.GetStringBuilder ().Length = 0;
999 sw.Write ("{0} {1}", d3.Ticks, d3);
1000 AssertEquals ("#3", "632241504000000000 6/30/2004 12:00:00 AM", sw.ToString ());
1001 sw.GetStringBuilder ().Length = 0;
1002 sw.Write ("{0} {1}", d4.Ticks, d4);
1003 AssertEquals ("#4", "632241504000000000 6/30/2004 12:00:00 AM", sw.ToString ());
1005 Thread.CurrentThread.CurrentCulture = ci;
1009 AssertEquals ("bug #76082", DateTime.MinValue,
1010 DateTime.ParseExact ("00010101T00:00:00",
1011 "yyyyMMdd'T'HH':'mm':'ss",
1012 DateTimeFormatInfo.InvariantInfo));
1016 public void DateTimeStylesAdjustToUniversal ()
1018 // bug #75995 : AdjustToUniversal
1019 DateTime t1 = DateTime.Parse ("2005-09-05T22:29:00Z",
1020 CultureInfo.InvariantCulture,
1021 DateTimeStyles.AdjustToUniversal);
1022 AssertEquals ("2005-09-05 22:29:00Z", t1.ToString ("u"));
1026 [ExpectedException (typeof (ArgumentException))]
1027 public void FromOADate_Min ()
1029 // minimum documented value isn't inclusive
1030 DateTime.FromOADate (-657435.0d);
1034 [ExpectedException (typeof (ArgumentException))]
1035 public void FromOADate_Max ()
1037 // maximum documented value isn't inclusive
1038 DateTime.FromOADate (2958466.0d);
1042 public void FromOADate ()
1044 // Note: OA (OLE Automation) dates aren't timezone sensitive
1045 AssertEquals ("Ticks-Zero", 599264352000000000, DateTime.FromOADate (0.0d).Ticks);
1046 AssertEquals ("Ticks-Min", 31242239136000000, DateTime.FromOADate (-657434.999d).Ticks);
1047 AssertEquals ("Ticks-Max", 3155378975136000000, DateTime.FromOADate (2958465.999d).Ticks);
1051 public void ToOADate ()
1053 // Note: OA (OLE Automation) dates aren't timezone sensitive
1054 DateTime d = new DateTime (0);
1055 AssertEquals ("Unititialized", 0.0d, d.ToOADate ());
1056 d = new DateTime (599264352000000000);
1057 AssertEquals ("Ticks-Zero", 0.0d, d.ToOADate ());
1058 d = new DateTime (31242239136000000);
1059 AssertEquals ("Ticks-Min", -657434.999d, d.ToOADate ());
1060 d = new DateTime (3155378975136000000);
1061 AssertEquals ("Ticks-Max", 2958465.999d, d.ToOADate ());
1065 public void ToOADate_OverMax ()
1067 DateTime d = new DateTime (3155378975136000001);
1068 AssertEquals ("Over-Max", 2958465.999d, d.ToOADate ());
1072 public void ToOADate_MaxValue ()
1074 AssertEquals ("MaxValue", 2958465.99999999d, DateTime.MaxValue.ToOADate ());
1078 public void ToOADate_UnderMin ()
1080 DateTime d = new DateTime (31242239135999999);
1081 AssertEquals ("Under-Min", -657434.999d, d.ToOADate ());
1085 public void ToOADate_MinValue ()
1087 AssertEquals ("MinValue", 0, DateTime.MinValue.ToOADate ());
1091 public void MaxValueYear () // bug52075
1093 AssertEquals ("#01", "9999", DateTime.MaxValue.Year.ToString ());
1097 public void X509Certificate ()
1099 // if this test fails then *ALL* or *MOST* X509Certificate tests will also fails
1100 DateTime dt = DateTime.ParseExact ("19960312183847Z", "yyyyMMddHHmmssZ", null);
1102 AssertEquals ("Kind-Local-1", DateTimeKind.Local, dt.Kind);
1103 dt = dt.ToUniversalTime ();
1104 AssertEquals ("Kind-Utc-1", DateTimeKind.Utc, dt.Kind);
1106 dt = dt.ToUniversalTime ();
1108 AssertEquals ("yyyyMMddHHmmssZ", "03/12/1996 18:38:47", dt.ToString ());
1110 // technically this is invalid (PKIX) because of the missing seconds but it exists so...
1111 dt = DateTime.ParseExact ("9602231915Z", "yyMMddHHmmZ", null);
1113 AssertEquals ("Kind-Local-2", DateTimeKind.Local, dt.Kind);
1114 dt = dt.ToUniversalTime ();
1115 AssertEquals ("Kind-Utc-2", DateTimeKind.Utc, dt.Kind);
1117 dt = dt.ToUniversalTime ();
1119 AssertEquals ("yyMMddHHmmZ", "02/23/1996 19:15:00", dt.ToString ());
1124 [Category ("NotWorking")] // see bug #
1126 public void ZLiteral ()
1128 // However, "Z" and "'Z'" are different.
1129 DateTime dt = DateTime.ParseExact ("19960312183847Z", "yyyyMMddHHmmss'Z'", null);
1130 DateTime dtz = DateTime.ParseExact ("19960312183847Z", "yyyyMMddHHmmssZ", null);
1132 AssertEquals ("Kind-Unspecified-3", DateTimeKind.Unspecified, dt.Kind);
1133 dt = dt.ToLocalTime ();
1134 AssertEquals ("Kind-Local-3a", DateTimeKind.Local, dt.Kind);
1135 AssertEquals ("Kind-Local-3b", DateTimeKind.Local, dtz.Kind);
1137 dt = dt.ToLocalTime ();
1139 AssertEquals ("Z timezone handling", dt, dtz);
1143 public void QuotedFormat () // bug 56436
1145 string date = "28/Mar/2004:19:12:37 +0200";
1146 string [] expectedFormats = {"dd\"/\"MMM\"/\"yyyy:HH:mm:ss zz\"00\""};
1147 DateTime mydate = DateTime.ParseExact (date, expectedFormats, null, DateTimeStyles.AllowWhiteSpaces);
1151 public void CultureIndependentTests ()
1153 // Here I aggregated some tests mainly because of test
1154 // performance (iterating all the culture is heavy process).
1156 for (int i = 0; i < 32768; i++) {
1157 CultureInfo ci = null;
1158 string stage = "init";
1161 ci = new CultureInfo (i);
1162 // In fact InvatiantCulture is not neutral.
1164 if (ci.IsNeutralCulture && ci != CultureInfo.InvariantCulture)
1166 } catch (Exception) {
1169 Thread.CurrentThread.CurrentCulture = ci;
1173 // X509Certificate pattern is _always_ accepted.
1175 dt = DateTime.ParseExact ("19960312183847Z", "yyyyMMddHHmmssZ", null);
1178 // culture 1025 ar-SA fails
1180 // dt = DateTime.Parse ("19960312183847Z");
1183 dt = DateTime.Parse ("2004-05-26T03:29:01.1234567");
1185 dt = DateTime.Parse ("2004-05-26T03:29:01.1234567-07:00");
1187 // memo: the least LCID is 127, and then 1025(ar-SA)
1189 // "th-TH" locale rejects them since in
1190 // ThaiBuddhistCalendar the week of a day is different.
1191 // (and also for years).
1192 if (ci.LCID != 1054) {
1195 dt = DateTime.Parse ("Sat, 29 Oct 1994 12:00:00 GMT", ci);
1196 } catch (FormatException ex) {
1197 Fail (String.Format ("stage 5.1 RFC1123: culture {0} {1} failed: {2}", i, ci, ex.Message));
1199 /* comment out until we fix RFC1123
1201 if (dt != TimeZone.CurrentTimeZone.ToUniversalTime (dt))
1202 Assert (String.Format ("bug #47720 on culture {0} {1}", ci.LCID, ci), 12 != dt.Hour);
1204 // variant of RFC1123
1207 dt = DateTime.Parse ("Sat, 1 Oct 1994 03:00:00", ci);
1208 } catch (FormatException ex) {
1209 Fail (String.Format ("stage 6.1 RFC1123 variant: culture {0} {1} failed: {2}", i, ci, ex.Message));
1212 AssertEquals (String.Format ("stage 7.1 RFC1123 variant on culture {0} {1}", ci.LCID, ci), 3, dt.Hour);
1218 case 1125: // div-MV
1222 // 02/25/2002 04:25:13 as is
1223 long tick1 = 631502079130000000;
1224 long tick2 = TimeZone.CurrentTimeZone.ToLocalTime (new DateTime (tick1)).Ticks; // adjusted to local time
1225 dt = DateTime.Parse ("Mon, 25 Feb 2002 04:25:13 GMT", ci);
1226 AssertEquals (String.Format ("GMT variant. culture={0} {1}", i, ci), tick2, dt.Ticks);
1231 // ka-GE rejects these formats under MS.NET.
1232 // I wonder why. Also, those tests fail under .NET 1.0.
1233 if (ci.LCID != 1079) {
1235 dt = DateTime.Parse ("2002-02-25");
1237 dt = DateTime.Parse ("2002-02-25Z");
1239 dt = DateTime.Parse ("2002-02-25T19:20:00+09:00");
1241 case 1038: // FIXME: MS passes this culture.
1242 case 1062: // FIXME: MS passes this culture.
1243 case 1078: // MS does not pass this culture. Dunno why.
1249 dt = DateTime.Parse ("2002#02#25 19:20:00");
1250 // this stage fails under MS 2.0
1252 AssertEquals (String.Format ("bug #58938 on culture {0} {1}", ci.LCID, ci), 19, dt.Hour);
1257 dt = DateTime.Parse ("2002-02-25 12:01:03");
1260 dt = DateTime.Parse ("2002#02#25 12:01:03");
1262 dt = DateTime.Parse ("2002%02%25 12:01:03");
1265 if (ci.DateTimeFormat.TimeSeparator != ".")
1266 dt = DateTime.Parse ("2002.02.25 12:01:03");
1268 dt = DateTime.Parse ("2003/01/23 01:34:56 GMT");
1269 dt = TimeZone.CurrentTimeZone.ToUniversalTime (dt);
1270 AssertEquals (String.Format ("stage 18.1 RFC1123 UTC {0} {1}", i, ci), 1, dt.Hour);
1272 // This test was fixed from 12:34:56 to
1273 // 01:34:56 since 1078 af-ZA failed
1274 // because of hour interpretation
1275 // difference (af-ZA expects 0).
1276 // (IMHO it is MS BUG though.)
1277 dt = DateTime.Parse ("2003/01/23 12:34:56 GMT");
1278 dt = TimeZone.CurrentTimeZone.ToUniversalTime (dt);
1280 AssertEquals (String.Format ("stage 18.1 RFC1123 UTC {0} {1}", i, ci), 12, dt.Hour);
1283 } catch (FormatException ex) {
1284 Fail (String.Format ("stage {3}: Culture {0} {1} failed: {2}", i, ci, ex.Message, stage));
1290 [ExpectedException (typeof (ArgumentOutOfRangeException))]
1291 public void ToFileTime_MinValue ()
1293 DateTime.FromFileTime (Int64.MinValue);
1297 [ExpectedException (typeof (ArgumentOutOfRangeException))]
1298 public void ToFileTime_Negative ()
1300 DateTime.FromFileTime (-1);
1304 public void ToFileTime ()
1306 long u = DateTime.FromFileTimeUtc (0).Ticks;
1307 AssertEquals ("Utc-0", 504911232000000000, u);
1308 long max = DateTime.MaxValue.Ticks - 504911232000000000; // w32file_epoch
1309 AssertEquals ("Utc-MaxValue", 3155378975999999999, DateTime.FromFileTimeUtc (max).Ticks);
1311 long t = DateTime.FromFileTime (0).Ticks;
1312 Assert ("ToFileTime>", t > (u - TimeSpan.TicksPerDay));
1313 Assert ("ToFileTime<", t < (u + TimeSpan.TicksPerDay));
1317 [ExpectedException (typeof (ArgumentOutOfRangeException))]
1318 public void ToFileTimeUtc_MinValue ()
1320 DateTime.FromFileTimeUtc (Int64.MinValue);
1324 [ExpectedException (typeof (ArgumentOutOfRangeException))]
1325 public void ToFileTimeUtc_Negative ()
1327 DateTime.FromFileTimeUtc (-1);
1331 public void Milliseconds ()
1333 DateTime dt = DateTime.Parse ("2004-05-26T03:29:01.1234567-07:00");
1334 dt = TimeZone.CurrentTimeZone.ToUniversalTime (dt);
1335 AssertEquals ("DateTime with milliseconds", 632211641411234567, dt.Ticks);
1340 [ExpectedException (typeof (FormatException))]
1342 [Ignore ("Works only under MS 1.x (not Mono or MS 2.0).")]
1344 public void ParseNotExact ()
1346 // The error reported is:
1347 // String was not recognized as valid DateTime
1348 DateTime dt = DateTime.Parse ("2004-05-26T03:29:01-07:00 foo");
1349 dt = TimeZone.CurrentTimeZone.ToUniversalTime (dt);
1350 AssertEquals ("DateTime.Parse not exact", 632211641410000000, dt.Ticks);
1354 public void ParseExact_Bug80094 ()
1356 // we can safely change the curernt culture, as the original value will
1357 // be restored on TearDown
1358 Thread.CurrentThread.CurrentCulture = new CultureInfo ("ja-JP");
1359 string y = string.Format ("{0}-{1}-{2} {3}", DateTime.Now.Year.ToString (),
1360 "11", "29", "06:34");
1361 DateTime date = DateTime.ParseExact (y, "yyyy-MMM-dd hh:mm", null);
1362 AssertEquals ("#1", DateTime.Now.Year, date.Year);
1363 AssertEquals ("#2", 11, date.Month);
1364 AssertEquals ("#3", 29, date.Day);
1365 AssertEquals ("#4", 6, date.Hour);
1366 AssertEquals ("#5", 34, date.Minute);
1367 AssertEquals ("#6", 0, date.Second);
1368 AssertEquals ("#7", 0, date.Millisecond);
1372 [ExpectedException (typeof (FormatException))]
1373 public void ParseExactIsExact()
1375 DateTime.ParseExact ("2004-05-26T03:29:01-07:00 foo", "yyyy-MM-ddTHH:mm:sszzz", null);
1379 [ExpectedException (typeof (FormatException))]
1380 public void ParseExactDoesNotEatZ ()
1382 DateTime.ParseExact ("2004-05-26T03:29:01", "yyyy-MM-ddTHH:mm:ssZ", null);
1386 public void ParseExactMilliseconds ()
1388 DateTime dt = DateTime.ParseExact ("2004-05-26T03:29:01.1234567-07:00", "yyyy-MM-ddTHH:mm:ss.fffffffzzz", null);
1389 dt = TimeZone.CurrentTimeZone.ToUniversalTime (dt);
1390 AssertEquals ("DateTime.ParseExact with milliseconds", 632211641411234567, dt.Ticks);
1394 public void NoColonTimeZone ()
1396 AssertEquals ("DateTime with colon-less timezone", true, DateTime.Parse ("2004-05-26T03:29:01-0700").Ticks != DateTime.Parse ("2004-05-26T03:29:01-0800").Ticks);
1400 public void WithColonTimeZone ()
1402 AssertEquals ("DateTime with colon tiemzone", true, DateTime.Parse ("2004-05-26T03:29:01-07:00").Ticks != DateTime.Parse ("2004-05-26T03:29:01-08:00").Ticks);
1406 [ExpectedException (typeof (FormatException))]
1407 public void EmptyFormatPattern ()
1409 DateTime.ParseExact (String.Empty, String.Empty, null);
1413 [ExpectedException (typeof (InvalidCastException))]
1414 public void IConvertible_ToType_Boolean ()
1416 ((IConvertible)DateTime.Now).ToType (typeof (bool), null);
1420 [ExpectedException (typeof (InvalidCastException))]
1421 public void IConvertible_ToType_Byte ()
1423 ((IConvertible)DateTime.Now).ToType (typeof (byte), null);
1427 [ExpectedException (typeof (InvalidCastException))]
1428 public void IConvertible_ToType_Char ()
1430 ((IConvertible)DateTime.Now).ToType (typeof (char), null);
1434 public void IConvertible_ToType_DateTime ()
1436 DateTime dt = DateTime.Now;
1437 DateTime dt2 = (DateTime) ((IConvertible)dt).ToType (typeof (DateTime), null);
1438 Assert ("Object", dt.Equals (dt2));
1442 [ExpectedException (typeof (InvalidCastException))]
1443 public void IConvertible_ToType_DBNull ()
1445 ((IConvertible)DateTime.Now).ToType (typeof (DBNull), null);
1449 [ExpectedException (typeof (InvalidCastException))]
1450 public void IConvertible_ToType_Decimal ()
1452 ((IConvertible)DateTime.Now).ToType (typeof (decimal), null);
1456 [ExpectedException (typeof (InvalidCastException))]
1457 public void IConvertible_ToType_Double ()
1459 ((IConvertible)DateTime.Now).ToType (typeof (double), null);
1463 [ExpectedException (typeof (ArgumentNullException))]
1464 public void IConvertible_ToType_Empty ()
1466 ((IConvertible)DateTime.Now).ToType (null, null);
1470 [ExpectedException (typeof (InvalidCastException))]
1471 public void IConvertible_ToType_Int16 ()
1473 ((IConvertible)DateTime.Now).ToType (typeof (short), null);
1477 [ExpectedException (typeof (InvalidCastException))]
1478 public void IConvertible_ToType_Int32 ()
1480 ((IConvertible)DateTime.Now).ToType (typeof (int), null);
1484 [ExpectedException (typeof (InvalidCastException))]
1485 public void IConvertible_ToType_Int64 ()
1487 ((IConvertible)DateTime.Now).ToType (typeof (long), null);
1491 public void IConvertible_ToType_Object ()
1493 DateTime dt = DateTime.Now;
1494 object o = ((IConvertible)dt).ToType (typeof (object), null);
1495 Assert ("Object", dt.Equals (o));
1499 [ExpectedException (typeof (InvalidCastException))]
1500 public void IConvertible_ToType_SByte ()
1502 ((IConvertible)DateTime.Now).ToType (typeof (sbyte), null);
1506 [ExpectedException (typeof (InvalidCastException))]
1507 public void IConvertible_ToType_Single ()
1509 ((IConvertible)DateTime.Now).ToType (typeof (float), null);
1513 public void IConvertible_ToType_String ()
1515 DateTime dt = DateTime.Now;
1516 string s = (string) ((IConvertible)dt).ToType (typeof (string), null);
1517 AssertEquals ("String", dt.ToString (), s);
1521 [ExpectedException (typeof (InvalidCastException))]
1522 public void IConvertible_ToType_UInt16 ()
1524 ((IConvertible)DateTime.Now).ToType (typeof (ushort), null);
1528 [ExpectedException (typeof (InvalidCastException))]
1529 public void IConvertible_ToType_UInt32 ()
1531 ((IConvertible)DateTime.Now).ToType (typeof (uint), null);
1535 [ExpectedException (typeof (InvalidCastException))]
1536 public void IConvertible_ToType_UInt64 ()
1538 ((IConvertible)DateTime.Now).ToType (typeof (ulong), null);
1545 if (DateTime.Now == DateTime.UtcNow)
1546 return; // This test does not make sense.
1547 if (TimeZone.CurrentTimeZone.GetUtcOffset (DateTime.UtcNow)
1548 != TimeZone.CurrentTimeZone.GetUtcOffset (DateTime.Now))
1549 return; // In this case it does not satisfy the test premises.
1551 AssertEquals ("#0", DateTimeKind.Local, DateTime.Now.Kind);
1552 AssertEquals ("#0a", DateTimeKind.Local, DateTime.Today.Kind);
1554 DateTime utc = DateTime.UtcNow;
1555 DateTime now = new DateTime (utc.Ticks + TimeZone.
1556 CurrentTimeZone.GetUtcOffset (utc).Ticks, DateTimeKind.Local);
1557 DateTime utctouniv = utc.ToUniversalTime ();
1558 DateTime nowtouniv = now.ToUniversalTime ();
1559 DateTime utctoloc = utc.ToLocalTime ();
1560 DateTime nowtoloc = now.ToLocalTime ();
1562 AssertEquals ("#1", DateTimeKind.Utc, utc.Kind);
1563 AssertEquals ("#2", DateTimeKind.Local, now.Kind);
1564 AssertEquals ("#3", DateTimeKind.Utc, utctouniv.Kind);
1565 AssertEquals ("#4", DateTimeKind.Utc, nowtouniv.Kind);
1566 AssertEquals ("#5", DateTimeKind.Local, utctoloc.Kind);
1567 AssertEquals ("#6", DateTimeKind.Local, nowtoloc.Kind);
1568 AssertEquals ("#7", utc, utctouniv);
1569 AssertEquals ("#8", utc, nowtouniv);
1570 AssertEquals ("#9", now, nowtoloc);
1571 AssertEquals ("#10", now, utctoloc);
1575 public void InstanceMembersAndKind ()
1577 AssertEquals ("#1", DateTimeKind.Utc, DateTime.UtcNow.Date.Kind);
1578 AssertEquals ("#2", DateTimeKind.Utc, DateTime.UtcNow.Add (TimeSpan.FromMinutes (1)).Kind);
1579 AssertEquals ("#3", DateTimeKind.Utc, DateTime.UtcNow.Subtract (TimeSpan.FromMinutes (1)).Kind);
1580 AssertEquals ("#4-1", DateTimeKind.Utc, DateTime.UtcNow.AddDays (1).Kind);
1581 AssertEquals ("#4-2", DateTimeKind.Utc, DateTime.UtcNow.AddTicks (1).Kind);
1582 AssertEquals ("#4-3", DateTimeKind.Utc, DateTime.UtcNow.AddHours (1).Kind);
1583 AssertEquals ("#4-4", DateTimeKind.Utc, DateTime.UtcNow.AddMinutes (1).Kind);
1584 AssertEquals ("#4-5", DateTimeKind.Utc, DateTime.UtcNow.AddSeconds (1).Kind);
1585 AssertEquals ("#4-6", DateTimeKind.Utc, DateTime.UtcNow.AddMilliseconds (1).Kind);
1586 AssertEquals ("#4-7", DateTimeKind.Utc, DateTime.UtcNow.AddMonths (1).Kind);
1587 AssertEquals ("#4-8", DateTimeKind.Utc, DateTime.UtcNow.AddYears (1).Kind);
1588 AssertEquals ("#5-1", DateTimeKind.Utc, (DateTime.UtcNow + TimeSpan.FromMinutes (1)).Kind);
1589 AssertEquals ("#5-2", DateTimeKind.Utc, (DateTime.UtcNow - TimeSpan.FromMinutes (1)).Kind);
1593 public void FromBinary ()
1595 DateTime dt_utc = DateTime.FromBinary (0x4000000000000001);
1596 AssertEquals ("Utc", DateTimeKind.Utc, dt_utc.Kind);
1597 AssertEquals ("Utc/Ticks", 1, dt_utc.Ticks);
1599 DateTime dt_local = DateTime.FromBinary (unchecked ((long) 0x8000000000000001));
1600 AssertEquals ("Local", DateTimeKind.Local, dt_local.Kind);
1602 DateTime dt_unspecified = DateTime.FromBinary (0x0000000000000001);
1603 AssertEquals ("Unspecified", DateTimeKind.Unspecified, dt_unspecified.Kind);
1604 AssertEquals ("Unspecified/Ticks", 1, dt_unspecified.Ticks);
1606 DateTime dt_local2 = DateTime.FromBinary (unchecked ((long) 0xC000000000000001));
1607 AssertEquals ("Local2", DateTimeKind.Local, dt_local2.Kind);
1608 AssertEquals ("Local/Ticks", dt_local.Ticks, dt_local2.Ticks);
1612 public void ToBinary ()
1614 DateTime dt_local = new DateTime (1, DateTimeKind.Local);
1615 AssertEquals ("Local.ToBinary", 1, (ulong) dt_local.ToBinary () >> 63);
1616 AssertEquals ("Local.Ticks", 1, dt_local.Ticks);
1618 DateTime dt_utc = new DateTime (1, DateTimeKind.Utc);
1619 AssertEquals ("Utc.ToBinary", 0x4000000000000001, dt_utc.ToBinary ());
1620 AssertEquals ("Utc.Ticks", 1, dt_utc.Ticks);
1622 DateTime dt_unspecified = new DateTime (1, DateTimeKind.Unspecified);
1623 AssertEquals ("Unspecified.ToBinary", 1, dt_unspecified.ToBinary ());
1624 AssertEquals ("Unspecified.Ticks", 1, dt_unspecified.Ticks);
1628 public void TestMin ()
1630 // This should never throw.
1631 DateTime.MinValue.ToLocalTime ();
1635 public void OmittedSecondsFraction ()
1637 DateTime today = DateTime.Today;
1638 AssertEquals ("#1", "00:00:00.13579", today.AddTicks (1357900).ToString ("HH:mm:ss.FFFFFFF"));
1639 DateTime dt = DateTime.ParseExact ("00:00:00.13579", "HH:mm:ss.FFFFFFF", CultureInfo.InvariantCulture);
1640 AssertEquals ("#2", today, dt.AddTicks (-1357900));
1641 // it's more than strange ...
1642 AssertEquals ("#3", String.Empty, today.ToString (".FFFFFFF"));
1643 AssertEquals ("#4", "$", today.ToString ("$FFFFFFF"));