case 'K':
if (s [valuePos] == 'Z') {
valuePos++;
- useutc = true;
- style |= DateTimeStyles.AdjustToUniversal;
+ useutc = true;
}
else if (s [valuePos] == '+' || s [valuePos] == '-') {
if (tzsign != -1)
bool kind_specified = true;
TimeSpan utcoffset;
+ bool adjustToUniversal = (style & DateTimeStyles.AdjustToUniversal) != 0;
+
if (tzsign != -1) {
if (tzoffmin == -1)
tzoffmin = 0;
tzoffset = -tzoffset;
utcoffset = new TimeSpan (tzoffset, tzoffmin, 0);
- }
+ long newticks = (result.ticks - utcoffset).Ticks;
+ if (newticks < 0)
+ newticks += TimeSpan.TicksPerDay;
+ result = new DateTime (false, new TimeSpan (newticks));
#if NET_2_0
- else if (useutc || ((style & DateTimeStyles.AssumeUniversal) != 0))
-#else
- else if (useutc)
-#endif
- utcoffset = new TimeSpan (0, 0, 0);
- else {
- // If no timezone was specified, default to the local timezone.
- TimeZone tz = TimeZone.CurrentTimeZone;
- utcoffset = tz.GetUtcOffset (result);
-
-#if NET_2_0
- if ((style & DateTimeStyles.AssumeLocal) == 0)
+ result.kind = DateTimeKind.Utc;
+ if ((style & DateTimeStyles.RoundtripKind) != 0)
+ result = result.ToLocalTime ();
#endif
- kind_specified = false;
}
-
- long newticks = (result.ticks - utcoffset).Ticks;
-
- result = new DateTime (false, new TimeSpan (newticks));
-
- if (kind_specified && ((style & DateTimeStyles.AdjustToUniversal) != 0)) {
-#if NET_2_0
+#if NET_2_0
+ else if (useutc || ((style & DateTimeStyles.AssumeUniversal) != 0))
result.kind = DateTimeKind.Utc;
-#endif
+ else if ((style & DateTimeStyles.AssumeLocal) != 0)
+ result.kind = DateTimeKind.Local;
+
+ bool adjustToLocal = !adjustToUniversal && (style & DateTimeStyles.RoundtripKind) == 0;
+ if (result.kind != DateTimeKind.Unspecified)
+ {
+ if (adjustToUniversal)
+ result = result.ToUniversalTime ();
+ else if (adjustToLocal)
+ result = result.ToLocalTime ();
}
- else {
+#else
+ if (!adjustToUniversal && (useutc || tzsign != -1))
result = result.ToLocalTime ();
-#if NET_2_0
- if (!kind_specified)
- result.kind = DateTimeKind.Unspecified;
#endif
- }
-
return true;
}
DateTimeStyles style)
{
DateTimeFormatInfo dfi = DateTimeFormatInfo.GetInstance (fp);
-
+#if NET_2_0
+ CheckStyle (style);
+#endif
if (s == null)
throw new ArgumentNullException ("s");
if (formats == null)
if (!ParseExact (s, formats, dfi, style, out result, true, ref longYear))
throw new FormatException ();
return result;
- }
+ }
#if NET_2_0
+ private static void CheckStyle (DateTimeStyles style)
+ {
+ if ( (style & DateTimeStyles.RoundtripKind) != 0)
+ {
+ if ((style & DateTimeStyles.AdjustToUniversal) != 0 || (style & DateTimeStyles.AssumeLocal) != 0 ||
+ (style & DateTimeStyles.AssumeUniversal) != 0)
+ throw new ArgumentException ("The DateTimeStyles value RoundtripKind cannot be used with the values AssumeLocal, Asersal or AdjustToUniversal.", "style");
+ }
+ if ((style & DateTimeStyles.AssumeUniversal) != 0 && (style & DateTimeStyles.AssumeLocal) != 0)
+ throw new ArgumentException ("The DateTimeStyles values AssumeLocal and AssumeUniversal cannot be used together.", "style");
+ }
+
public static bool TryParse (string s, out DateTime result)
{
try {
Assert.AreEqual (dt.Ticks, d1.Ticks, "#3");
Assert.AreEqual (DateTimeKind.Unspecified, d1.Kind, "#4");
}
+
+ [Test]
+ public void TestRoundTrip () {
+ DateTime result;
+ DateTimeStyles roundTripStyle = DateTimeStyles.RoundtripKind;
+ string utcDate = "2008-02-21T11:14:18.2721262Z";
+ string localDate = "2008-02-21T11:14:18.2721262+02:00";
+ string unspec = "2008-02-21T11:14:18.2721262";
+ String [] formats = {"yyyy-MM-ddTHH:mm:ssK", "yyyy-MM-ddTHH:mm:ss.FFFFFFFK"};
+
+ result = DateTime.ParseExact (localDate, formats, CultureInfo.InvariantCulture, roundTripStyle);
+ Assert.AreEqual (result.Kind, DateTimeKind.Local);
+ Assert.AreEqual (result.ToUniversalTime ().Ticks, 633391820582721262);
+
+ result = DateTime.ParseExact (unspec, formats, CultureInfo.InvariantCulture, roundTripStyle);
+ Assert.AreEqual (result.Kind, DateTimeKind.Unspecified);
+ Assert.AreEqual (result.Ticks, 633391892582721262);
+
+ result = DateTime.ParseExact (utcDate, formats, CultureInfo.InvariantCulture, roundTripStyle);
+ Assert.AreEqual (result.Kind, DateTimeKind.Utc);
+ Assert.AreEqual (result.Ticks, 633391892582721262);
+
+ }
+
+ [Test]
+ public void TestRegularStyle () {
+ DateTime result;
+ DateTimeStyles style = DateTimeStyles.AllowLeadingWhite | DateTimeStyles.AllowTrailingWhite;
+ string utcDate = "2008-02-21T11:14:18.2721262Z";
+ string localDate = "2008-02-21T11:14:18.2721262+02:00";
+ string unspec = "2008-02-21T11:14:18.2721262";
+ String [] formats = {"yyyy-MM-ddTHH:mm:ssK", "yyyy-MM-ddTHH:mm:ss.FFFFFFFK"};
+
+ result = DateTime.ParseExact (localDate, formats, CultureInfo.InvariantCulture, style);
+ Assert.AreEqual (result.Kind, DateTimeKind.Local);
+ Assert.AreEqual (result.ToUniversalTime ().Ticks, 633391820582721262);
+
+ result = DateTime.ParseExact (unspec, formats, CultureInfo.InvariantCulture, style);
+ Assert.AreEqual (result.Kind, DateTimeKind.Unspecified);
+ Assert.AreEqual (result.Ticks, 633391892582721262);
+
+ result = DateTime.ParseExact (utcDate, formats, CultureInfo.InvariantCulture, style);
+ Assert.AreEqual (result.Kind, DateTimeKind.Local);
+ Assert.AreEqual (result.ToUniversalTime ().Ticks, 633391892582721262);
+ }
+
+ [Test]
+ public void TestAssumeLocal () {
+ DateTime result;
+ DateTimeStyles assumeLocal = DateTimeStyles.AssumeLocal;
+ string utcDate = "2008-02-21T11:14:18.2721262Z";
+ string localDate = "2008-02-21T11:14:18.2721262+02:00";
+ string unspec = "2008-02-21T11:14:18.2721262";
+ String [] formats = {"yyyy-MM-ddTHH:mm:ssK", "yyyy-MM-ddTHH:mm:ss.FFFFFFFK"};
+
+ result = DateTime.ParseExact (localDate, formats, CultureInfo.InvariantCulture, assumeLocal);
+ Assert.AreEqual (result.Kind, DateTimeKind.Local);
+ Assert.AreEqual (result.ToUniversalTime ().Ticks, 633391820582721262);
+
+ result = DateTime.ParseExact (unspec, formats, CultureInfo.InvariantCulture, assumeLocal);
+ Assert.AreEqual (result.Kind, DateTimeKind.Local);
+ Assert.AreEqual (result.Ticks, 633391892582721262);
+
+ result = DateTime.ParseExact (utcDate, formats, CultureInfo.InvariantCulture, assumeLocal);
+ Assert.AreEqual (result.Kind, DateTimeKind.Local);
+ Assert.AreEqual (result.ToUniversalTime ().Ticks, 633391892582721262);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentException))]
+ public void IllegalStyleCombination1()
+ {
+ DateTimeStyles illegal = DateTimeStyles.RoundtripKind | DateTimeStyles.AssumeLocal;
+ DateTime.ParseExact ("", "", null, illegal);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentException))]
+ public void IllegalStyleCombination2()
+ {
+ DateTimeStyles illegal = DateTimeStyles.RoundtripKind | DateTimeStyles.AdjustToUniversal;
+ DateTime.ParseExact ("", "", null, illegal);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentException))]
+ public void IllegalStyleCombination3()
+ {
+ DateTimeStyles illegal = DateTimeStyles.RoundtripKind | DateTimeStyles.AssumeUniversal;
+ DateTime.ParseExact ("", "", null, illegal);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentException))]
+ public void IllegalStyleCombination4()
+ {
+ DateTimeStyles illegal = DateTimeStyles.AssumeLocal | DateTimeStyles.AssumeUniversal;
+ DateTime.ParseExact ("", "", null, illegal);
+ }
#endif
}
}