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

Commit eba6ee2

Browse files
committed
Merge branch 'master' of github.com:ServiceStack/ServiceStack.Text
2 parents ffca4e1 + 14487ca commit eba6ee2

File tree

3 files changed

+86
-9
lines changed

3 files changed

+86
-9
lines changed

src/ServiceStack.Text/Common/DateTimeSerializer.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,13 @@ public static class DateTimeSerializer
4141
/// </summary>
4242
/// <param name="dateTime"></param>
4343
/// <returns></returns>
44-
private static DateTime Prepare(this DateTime dateTime)
44+
private static DateTime Prepare(this DateTime dateTime, bool parsedAsUtc=false)
4545
{
46-
if (JsConfig.AlwaysUseUtc && dateTime.Kind != DateTimeKind.Utc)
47-
return dateTime.ToStableUniversalTime();
48-
else
49-
return dateTime;
46+
if (JsConfig.AlwaysUseUtc)
47+
{
48+
return dateTime.Kind != DateTimeKind.Utc ? dateTime.ToStableUniversalTime() : dateTime;
49+
}
50+
return parsedAsUtc ? dateTime.ToLocalTime() : dateTime;
5051
}
5152

5253
public static DateTime? ParseShortestNullableXsdDateTime(string dateTimeStr)
@@ -72,7 +73,7 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr)
7273
}
7374

7475
if (dateTimeStr.Length == XsdDateTimeFormatSeconds.Length)
75-
return DateTime.ParseExact(dateTimeStr, XsdDateTimeFormatSeconds, null, DateTimeStyles.AdjustToUniversal);
76+
return DateTime.ParseExact(dateTimeStr, XsdDateTimeFormatSeconds, null, DateTimeStyles.AdjustToUniversal).Prepare(parsedAsUtc:true);
7677

7778
if (dateTimeStr.Length >= XsdDateTimeFormat3F.Length
7879
&& dateTimeStr.Length <= XsdDateTimeFormat.Length

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ public void Can_serialize_json_date_iso8601_unspecified()
309309
[Test]
310310
public void Can_deserialize_json_date_iso8601_withZOffset_asUtc()
311311
{
312+
JsConfig.AlwaysUseUtc = true;
312313
JsConfig.DateHandler = JsonDateHandler.ISO8601;
313314

314315
const string json = @"""1994-11-24T12:34:56Z""";

tests/ServiceStack.Text.Tests/Utils/DateTimeSerializerTests.cs

Lines changed: 78 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Xml;
23
using NUnit.Framework;
34
using ServiceStack.Text.Common;
45

@@ -123,7 +124,7 @@ public void DateTimeWithoutMilliseconds_should_always_be_deserialized_correctly_
123124

124125
serialized = TypeSerializer.SerializeToString(dateWithoutMillisecondsUtc);
125126
deserialized = TypeSerializer.DeserializeFromString<DateTime>(serialized);
126-
Assert.AreEqual(dateWithoutMillisecondsUtc, deserialized);
127+
Assert.AreEqual(dateWithoutMillisecondsUtc.ToLocalTime(), deserialized);
127128

128129
serialized = TypeSerializer.SerializeToString(dateWithoutMillisecondsLocal);
129130
deserialized = TypeSerializer.DeserializeFromString<DateTime>(serialized);
@@ -163,7 +164,7 @@ public void UtcDateTime_Is_Deserialized_As_Kind_Utc()
163164
[TestCase(0)]
164165
[TestCase(1)]
165166
[TestCase(2)]
166-
[TestCase(3)]
167+
//[TestCase(3)] //.NET Date BUG see: Test_MS_Dates
167168
[TestCase(4)]
168169
[TestCase(5)]
169170
[TestCase(6)]
@@ -222,5 +223,79 @@ public void Can_Serialize_new_DateTime()
222223
Assert.That(convertedUnixTimeMs.FromUnixTimeMs(), Is.EqualTo(newDateTime));
223224
}
224225

225-
}
226+
[Explicit("Test .NET Date Serialization behavior")]
227+
[TestCase(0)]
228+
[TestCase(1)]
229+
[TestCase(2)]
230+
[TestCase(3)]
231+
[TestCase(4)]
232+
[TestCase(5)]
233+
[TestCase(6)]
234+
[TestCase(7)]
235+
[TestCase(8)]
236+
public void Test_MS_Dates(int whichDate)
237+
{
238+
var dateTime = _dateTimeTests[whichDate];
239+
var dateTimeStr = XmlConvert.ToString(dateTime.ToStableUniversalTime(), XmlDateTimeSerializationMode.Utc);
240+
dateTimeStr.Print(); //1972-03-24T05:00:00Z
241+
242+
var fromStr = DateTime.Parse(dateTimeStr);
243+
244+
fromStr.ToString().Print();
245+
246+
AssertDatesAreEqual(fromStr, dateTime);
247+
}
248+
}
249+
250+
[TestFixture]
251+
public class DateTimeISO8601Tests
252+
: TestBase
253+
{
254+
public class TestObject
255+
{
256+
public DateTime Date { get; set; }
257+
}
258+
259+
[TestFixtureSetUp]
260+
public void TestFixtureSetUp()
261+
{
262+
JsConfig.DateHandler = JsonDateHandler.ISO8601;
263+
}
264+
265+
[TestFixtureTearDown]
266+
public void TestFixtureTearDown()
267+
{
268+
JsConfig.Reset();
269+
}
270+
271+
[Test]
272+
public void DateTime_Is_Serialized_As_Utc_and_Deserialized_as_local()
273+
{
274+
var testObject = new TestObject
275+
{
276+
Date = new DateTime(2013, 1, 1, 0, 0, 1, DateTimeKind.Utc)
277+
};
278+
279+
Assert.AreEqual(DateTimeKind.Local, TypeSerializer.DeserializeFromString<TestObject>(TypeSerializer.SerializeToString<TestObject>(testObject)).Date.Kind);
280+
281+
//Can change default behavior with config
282+
using (JsConfig.With(alwaysUseUtc: true))
283+
{
284+
Assert.AreEqual(DateTimeKind.Utc, TypeSerializer.DeserializeFromString<TestObject>(TypeSerializer.SerializeToString<TestObject>(testObject)).Date.Kind);
285+
}
286+
287+
testObject = new TestObject
288+
{
289+
Date = new DateTime(2013, 1, 1, 0, 0, 0, DateTimeKind.Utc)
290+
};
291+
292+
Assert.AreEqual(DateTimeKind.Local, TypeSerializer.DeserializeFromString<TestObject>(TypeSerializer.SerializeToString<TestObject>(testObject)).Date.Kind);
293+
294+
//Can change default behavior with config
295+
using (JsConfig.With(alwaysUseUtc: true))
296+
{
297+
Assert.AreEqual(DateTimeKind.Utc, TypeSerializer.DeserializeFromString<TestObject>(TypeSerializer.SerializeToString<TestObject>(testObject)).Date.Kind);
298+
}
299+
}
300+
}
226301
}

0 commit comments

Comments
 (0)