Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 5a32c0a

Browse files
committed
Handle AssumeUtc DateTime with 3f or 7f seconds
1 parent 4507e0b commit 5a32c0a

File tree

2 files changed

+21
-11
lines changed

2 files changed

+21
-11
lines changed

src/ServiceStack.Text/Common/DateTimeSerializer.cs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ public static class DateTimeSerializer
2424
public const string CondensedDateTimeFormat = "yyyyMMdd"; //8
2525
public const string ShortDateTimeFormat = "yyyy-MM-dd"; //11
2626
public const string DefaultDateTimeFormat = "dd/MM/yyyy HH:mm:ss"; //20
27-
public const string DefaultDateTimeFormatWithFraction = "dd/MM/yyyy HH:mm:ss.fff"; //24
2827
public const string XsdDateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffffffZ"; //29
2928
public const string XsdDateTimeFormat3F = "yyyy-MM-ddTHH:mm:ss.fffZ"; //25
3029
public const string XsdDateTimeFormatSeconds = "yyyy-MM-ddTHH:mm:ssZ"; //21
@@ -92,15 +91,6 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr)
9291
return unspecifiedDate.Prepare();
9392
}
9493

95-
if (dateTimeStr.Length == DefaultDateTimeFormatWithFraction.Length)
96-
{
97-
var unspecifiedDate = JsConfig.AssumeUtc
98-
? DateTime.Parse(dateTimeStr, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal)
99-
: DateTime.Parse(dateTimeStr, CultureInfo.InvariantCulture);
100-
101-
return unspecifiedDate.Prepare();
102-
}
103-
10494
switch (JsConfig.DateHandler)
10595
{
10696
case DateHandler.UnixTime:
@@ -149,7 +139,8 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr)
149139

150140
try
151141
{
152-
var dateTime = DateTime.Parse(dateTimeStr, null, DateTimeStyles.AssumeLocal);
142+
var assumeKind = JsConfig.AssumeUtc ? DateTimeStyles.AssumeUniversal : DateTimeStyles.AssumeLocal;
143+
var dateTime = DateTime.Parse(dateTimeStr, CultureInfo.InvariantCulture, assumeKind);
153144
return dateTime.Prepare();
154145
}
155146
catch (FormatException)

tests/ServiceStack.Text.Tests/JsonTests/JsonDateTimeTests.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,5 +707,24 @@ public void Does_serialize_Dates_without_time_as_UTC_when_AssumeUtc()
707707
Assert.That(date.Kind, Is.EqualTo(DateTimeKind.Utc));
708708
Assert.That(date.ToString("yyyy-MM-dd"), Is.EqualTo("2000-01-01"));
709709
}
710+
711+
[Test]
712+
public void Does_parse_unspecified_date_with_7sec_fraction_as_UTC()
713+
{
714+
JsConfig.AssumeUtc = true;
715+
JsConfig.AlwaysUseUtc = true;
716+
717+
// var dateStr = "2014-08-27T14:30:23.123"; // Parsed OK
718+
var dateStr = "2014-08-27T14:30:23.1230000";
719+
var dateTime = dateStr.FromJson<DateTime>();
720+
721+
Assert.That(dateTime.Kind, Is.EqualTo(DateTimeKind.Utc));
722+
Assert.That(dateTime.Hour, Is.EqualTo(14));
723+
Assert.That(dateTime.Minute, Is.EqualTo(30));
724+
Assert.That(dateTime.Second, Is.EqualTo(23));
725+
Assert.That(dateTime.Millisecond, Is.EqualTo(123));
726+
727+
JsConfig.Reset();
728+
}
710729
}
711730
}

0 commit comments

Comments
 (0)