Skip to content

Commit

Permalink
Merge pull request #835 from HorstKakuschke/master
Browse files Browse the repository at this point in the history
Fixes Xamarin Bug 16742:  XmlConvert.ToDateTime(string, XmlDateTimeSeria...
  • Loading branch information
migueldeicaza committed Feb 12, 2014
2 parents e753ca2 + 88af483 commit 2cf7497
Show file tree
Hide file tree
Showing 4 changed files with 366 additions and 55 deletions.
55 changes: 4 additions & 51 deletions mcs/class/System.XML/System.Xml/XmlConvert.cs
Expand Up @@ -140,48 +140,6 @@ public class XmlConvert {
"---ddZ",
};

#if NET_2_0
static readonly string [] defaultDateTimeFormats = new string [] {
"yyyy-MM-ddTHH:mm:ss", // dateTime(1)
"yyyy-MM-ddTHH:mm:ss.FFFFFFF", // dateTime(2)
"yyyy-MM-dd", // date
"HH:mm:ss", // time
"yyyy-MM", // gYearMonth
"yyyy", // gYear
"--MM-dd", // gMonthDay
"---dd", // gDay
};

static readonly string [] roundtripDateTimeFormats;
static readonly string [] localDateTimeFormats;
static readonly string [] utcDateTimeFormats;
static readonly string [] unspecifiedDateTimeFormats;

static XmlConvert ()
{
int l = defaultDateTimeFormats.Length;
roundtripDateTimeFormats = new string [l * 2];
localDateTimeFormats = new string [l * 2];
utcDateTimeFormats = new string [l * 3];
unspecifiedDateTimeFormats = new string [l * 5];
for (int i = 0; i < l; i++) {
string s = defaultDateTimeFormats [i];
var z = s + 'Z';
localDateTimeFormats [i * 2] = s + (s [s.Length - 1] == 's' || s [s.Length - 1] == 'F' ? "zzz" : String.Empty);
localDateTimeFormats [i * 2 + 1] = z;
roundtripDateTimeFormats [i * 2] = s + 'K';
roundtripDateTimeFormats [i * 2 + 1] = z;
utcDateTimeFormats [i * 3] = s;
utcDateTimeFormats [i * 3 + 1] = z;
utcDateTimeFormats [i * 3 + 2] = s + "zzz";
unspecifiedDateTimeFormats [i * 5] = s;
unspecifiedDateTimeFormats [i * 5 + 1] = z;
unspecifiedDateTimeFormats [i * 5 + 2] = localDateTimeFormats [i];
unspecifiedDateTimeFormats [i * 5 + 3] = roundtripDateTimeFormats [i];
unspecifiedDateTimeFormats [i * 5 + 4] = utcDateTimeFormats [i];
}
}
#endif
static DateTimeStyles _defaultStyle = DateTimeStyles.AllowLeadingWhite | DateTimeStyles.AllowTrailingWhite;

public XmlConvert()
Expand Down Expand Up @@ -369,20 +327,15 @@ public static DateTime ToDateTime (string s)
#if NET_2_0
public static DateTime ToDateTime (string s, XmlDateTimeSerializationMode dateTimeOption)
{
DateTime dt;
switch (dateTimeOption) {
case XmlDateTimeSerializationMode.Local:
dt = ToDateTime (s, localDateTimeFormats);
return new DateTime (dt.Ticks, DateTimeKind.Local);
return ToDateTime(s, datetimeFormats, _defaultStyle | DateTimeStyles.AssumeLocal).ToLocalTime();
case XmlDateTimeSerializationMode.RoundtripKind:
return ToDateTime (s, roundtripDateTimeFormats, _defaultStyle | DateTimeStyles.RoundtripKind);
return ToDateTime(s, datetimeFormats, _defaultStyle | DateTimeStyles.RoundtripKind);
case XmlDateTimeSerializationMode.Utc:
dt = ToDateTime (s, utcDateTimeFormats);
return new DateTime (dt.Ticks, DateTimeKind.Utc);
case XmlDateTimeSerializationMode.Unspecified:
return ToDateTime (s, unspecifiedDateTimeFormats);
return ToDateTime(s, datetimeFormats, _defaultStyle | DateTimeStyles.AssumeUniversal).ToUniversalTime();
default:
return ToDateTime (s, defaultDateTimeFormats);
return new DateTime (ToDateTime(s, datetimeFormats, _defaultStyle | DateTimeStyles.RoundtripKind).Ticks, DateTimeKind.Unspecified);
}
}
#endif
Expand Down

0 comments on commit 2cf7497

Please sign in to comment.