Author: atsushi
Date: 2005-05-25 04:29:39 -0400 (Wed, 25 May 2005)
New Revision: 44981
Modified:
trunk/mcs/class/corlib/System/ChangeLog
trunk/mcs/class/corlib/System/DateTime.cs
trunk/mcs/class/corlib/Test/System/ChangeLog
trunk/mcs/class/corlib/Test/System/DateTimeTest.cs
Log:
2005-05-25 Atsushi Enomoto <[EMAIL PROTECTED]>
* DateTime.cs : Added minimum digit parameter to ParseNumber() to
reject 2 digit years for "yyyy".
Use GetAllDateTimePatterns() instead of constant string.
Fixed bug #72788.
* DateTimeTest.cs : added testcase for #72788. Test that assures we
reject 2 digit years for "yyyy".
Modified: trunk/mcs/class/corlib/System/ChangeLog
===================================================================
--- trunk/mcs/class/corlib/System/ChangeLog 2005-05-25 08:21:36 UTC (rev
44980)
+++ trunk/mcs/class/corlib/System/ChangeLog 2005-05-25 08:29:39 UTC (rev
44981)
@@ -1,5 +1,12 @@
2005-05-25 Atsushi Enomoto <[EMAIL PROTECTED]>
+ * DateTime.cs : Added minimum digit parameter to ParseNumber() to
+ reject 2 digit years for "yyyy".
+ Use GetAllDateTimePatterns() instead of constant string.
+ Fixed bug #72788.
+
+2005-05-25 Atsushi Enomoto <[EMAIL PROTECTED]>
+
* DateTime.cs : next_not_digit prevented some valid parse.
Just remove it, since now we pass max length to ParseNumber() and
thus it is not needed anymore. Fixed bug 63137.
Modified: trunk/mcs/class/corlib/System/DateTime.cs
===================================================================
--- trunk/mcs/class/corlib/System/DateTime.cs 2005-05-25 08:21:36 UTC (rev
44980)
+++ trunk/mcs/class/corlib/System/DateTime.cs 2005-05-25 08:29:39 UTC (rev
44981)
@@ -702,18 +702,17 @@
DateTimeFormatInfo dfi = DateTimeFormatInfo.GetInstance
(fp);
bool longYear = false;
- // Try common formats.
- if (ParseExact (s, commonFormats, dfi, styles, out
result, false, ref longYear))
- return result;
- // Try common formats, also with invariant culture
- if (ParseExact (s, commonFormats,
DateTimeFormatInfo.InvariantInfo, styles, out result, false, ref longYear))
+ // Try all the patterns
+ if (ParseExact (s, dfi.GetAllDateTimePatterns (), dfi,
styles, out result, false, ref longYear))
return result;
- // Next, try all the patterns
- string [] patterns = new string [] {"d", "D", "g", "G",
"f", "F", "m", "M", "r", "R", "s", "t", "T", "u", "U", "y", "Y"};
+ // Try common formats.
+// if (ParseExact (s, commonFormats, dfi, styles, out
result, false, ref longYear))
+// return result;
- if (ParseExact (s, patterns, dfi, styles, out result,
false, ref longYear))
+ // Try common formats with invariant culture
+ if (ParseExact (s, commonFormats,
DateTimeFormatInfo.InvariantInfo, styles, out result, false, ref longYear))
return result;
if (longYear) {
@@ -730,6 +729,7 @@
}
internal static int _ParseNumber (string s, int valuePos,
+ int min_digits,
int digits,
bool leadingzero,
bool sloppy_parsing,
@@ -751,6 +751,10 @@
digits = real_digits;
}
+ if (digits < min_digits) {
+ num_parsed = -1;
+ return 0;
+ }
if (s.Length - valuePos < digits) {
num_parsed = -1;
@@ -951,9 +955,9 @@
if (day != -1)
return false;
if (num == 0)
- day = _ParseNumber (s,
valuePos, 2, false, sloppy_parsing, out num_parsed);
+ day = _ParseNumber (s,
valuePos,0, 2, false, sloppy_parsing, out num_parsed);
else if (num == 1)
- day = _ParseNumber (s,
valuePos, 2, true, sloppy_parsing, out num_parsed);
+ day = _ParseNumber (s,
valuePos,0, 2, true, sloppy_parsing, out num_parsed);
else if (num == 2)
dayofweek = _ParseEnum (s,
valuePos, dfi.AbbreviatedDayNames, out num_parsed);
else
@@ -966,9 +970,9 @@
if (month != -1)
return false;
if (num == 0)
- month = _ParseNumber (s,
valuePos, 2, false, sloppy_parsing, out num_parsed);
+ month = _ParseNumber (s,
valuePos, 0, 2, false, sloppy_parsing, out num_parsed);
else if (num == 1)
- month = _ParseNumber (s,
valuePos, 2, true, sloppy_parsing, out num_parsed);
+ month = _ParseNumber (s,
valuePos, 0, 2, true, sloppy_parsing, out num_parsed);
else if (num == 2)
month = _ParseEnum (s,
valuePos, dfi.AbbreviatedMonthNames , out num_parsed) + 1;
else
@@ -982,14 +986,14 @@
return false;
if (num == 0) {
- year = _ParseNumber (s,
valuePos, 2, false, sloppy_parsing, out num_parsed);
+ year = _ParseNumber (s,
valuePos,0, 2, false, sloppy_parsing, out num_parsed);
} else if (num < 3) {
- year = _ParseNumber (s,
valuePos, 2, true, sloppy_parsing, out num_parsed);
+ year = _ParseNumber (s,
valuePos,0, 2, true, sloppy_parsing, out num_parsed);
} else {
- year = _ParseNumber (s,
valuePos, 4, false, sloppy_parsing, out num_parsed);
+ year = _ParseNumber (s,
valuePos,4, 4, false, sloppy_parsing, out num_parsed);
if ((year >= 1000) &&
(num_parsed == 4) && (!longYear) && (s.Length > 4 + valuePos)) {
int np = 0;
- int ly = _ParseNumber
(s, valuePos, 5, false, sloppy_parsing, out np);
+ int ly = _ParseNumber
(s, valuePos, 5, 5, false, sloppy_parsing, out np);
longYear = (ly > 9999);
}
num = 3;
@@ -1003,10 +1007,10 @@
if (hour != -1)
return false;
if (num == 0)
- hour = _ParseNumber (s,
valuePos, 2, false, sloppy_parsing, out num_parsed);
+ hour = _ParseNumber (s,
valuePos,0, 2, false, sloppy_parsing, out num_parsed);
else
{
- hour = _ParseNumber (s,
valuePos, 2, true, sloppy_parsing, out num_parsed);
+ hour = _ParseNumber (s,
valuePos,0, 2, true, sloppy_parsing, out num_parsed);
num = 1;
}
@@ -1020,10 +1024,10 @@
if ((hour != -1) || (ampm >= 0))
return false;
if (num == 0)
- hour = _ParseNumber (s,
valuePos, 2, false, sloppy_parsing, out num_parsed);
+ hour = _ParseNumber (s,
valuePos,0, 2, false, sloppy_parsing, out num_parsed);
else
{
- hour = _ParseNumber (s,
valuePos, 2, true, sloppy_parsing, out num_parsed);
+ hour = _ParseNumber (s,
valuePos,0, 2, true, sloppy_parsing, out num_parsed);
num = 1;
}
if (hour >= 24)
@@ -1035,10 +1039,10 @@
if (minute != -1)
return false;
if (num == 0)
- minute = _ParseNumber (s,
valuePos, 2, false, sloppy_parsing, out num_parsed);
+ minute = _ParseNumber (s,
valuePos, 0, 2, false, sloppy_parsing, out num_parsed);
else
{
- minute = _ParseNumber (s,
valuePos, 2, true, sloppy_parsing, out num_parsed);
+ minute = _ParseNumber (s,
valuePos, 0, 2, true, sloppy_parsing, out num_parsed);
num = 1;
}
if (minute >= 60)
@@ -1049,10 +1053,10 @@
if (second != -1)
return false;
if (num == 0)
- second = _ParseNumber (s,
valuePos, 2, false, sloppy_parsing, out num_parsed);
+ second = _ParseNumber (s,
valuePos, 0, 2, false, sloppy_parsing, out num_parsed);
else
{
- second = _ParseNumber (s,
valuePos, 2, true, sloppy_parsing, out num_parsed);
+ second = _ParseNumber (s,
valuePos, 0, 2, true, sloppy_parsing, out num_parsed);
num = 1;
}
if (second >= 60)
@@ -1063,7 +1067,7 @@
if (fractionalSeconds != -1)
return false;
num = Math.Min (num, 6);
- double decimalNumber = (double)
_ParseNumber (s, valuePos, num+1, true, sloppy_parsing, out num_parsed);
+ double decimalNumber = (double)
_ParseNumber (s, valuePos, 0, num+1, true, sloppy_parsing, out num_parsed);
if (num_parsed == -1)
return false;
@@ -1104,12 +1108,12 @@
return false;
valuePos++;
if (num == 0)
- tzoffset = _ParseNumber (s,
valuePos, 2, false, sloppy_parsing, out num_parsed);
+ tzoffset = _ParseNumber (s,
valuePos, 0, 2, false, sloppy_parsing, out num_parsed);
else if (num == 1)
- tzoffset = _ParseNumber (s,
valuePos, 2, true, sloppy_parsing, out num_parsed);
+ tzoffset = _ParseNumber (s,
valuePos, 0, 2, true, sloppy_parsing, out num_parsed);
else
{
- tzoffset = _ParseNumber (s,
valuePos, 2, true, sloppy_parsing, out num_parsed);
+ tzoffset = _ParseNumber (s,
valuePos, 0, 2, true, sloppy_parsing, out num_parsed);
if (num_parsed < 0)
return false;
valuePos += num_parsed;
@@ -1118,7 +1122,7 @@
else if (!_ParseString (s,
valuePos, 0, dfi.TimeSeparator, out num_parsed))
return false;
valuePos += num_parsed;
- tzoffmin = _ParseNumber (s,
valuePos, 2, true, sloppy_parsing, out num_parsed);
+ tzoffmin = _ParseNumber (s,
valuePos, 0, 2, true, sloppy_parsing, out num_parsed);
if (num_parsed < 0)
return false;
num = 2;
Modified: trunk/mcs/class/corlib/Test/System/ChangeLog
===================================================================
--- trunk/mcs/class/corlib/Test/System/ChangeLog 2005-05-25 08:21:36 UTC
(rev 44980)
+++ trunk/mcs/class/corlib/Test/System/ChangeLog 2005-05-25 08:29:39 UTC
(rev 44981)
@@ -1,5 +1,10 @@
2005-05-25 Atsushi Enomoto <[EMAIL PROTECTED]>
+ * DateTimeTest.cs : added testcase for #72788. Test that assures we
+ reject 2 digit years for "yyyy".
+
+2005-05-25 Atsushi Enomoto <[EMAIL PROTECTED]>
+
* DateTimeTest.cs : removed some NotWorking (they are working).
Added testcase for #63137.
Modified: trunk/mcs/class/corlib/Test/System/DateTimeTest.cs
===================================================================
--- trunk/mcs/class/corlib/Test/System/DateTimeTest.cs 2005-05-25 08:21:36 UTC
(rev 44980)
+++ trunk/mcs/class/corlib/Test/System/DateTimeTest.cs 2005-05-25 08:29:39 UTC
(rev 44981)
@@ -730,9 +730,9 @@
}
[Test]
- // bug #71289
public void TestParse5 ()
{
+ // bug #71289
DateTime.Parse ("Sat,,,,,, 01 Oct 1994 03:00:00",
CultureInfo.InvariantCulture);
// more example...
@@ -747,6 +747,19 @@
} catch (FormatException) {
}
#endif
+
+ // bug #72788
+ DateTime dt = DateTime.Parse ("21/02/05", new CultureInfo
("fr-FR"));
+ AssertEquals (2005, dt.Year);
+ AssertEquals (02, dt.Month);
+ AssertEquals (21, dt.Day);
+
+ // don't allow 2 digit years where we require 4.
+ try {
+ DateTime.ParseExact ("05", "yyyy",
CultureInfo.InvariantCulture);
+ Fail ("Reject 2 digit years for yyyy");
+ } catch (FormatException) {
+ }
}
[Test]
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches