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

Commit 3669c31

Browse files
committed
Sepcify DateTime Kind and add more tests verifying deserialization of LocalTime
1 parent b8fde7c commit 3669c31

File tree

3 files changed

+47
-7
lines changed

3 files changed

+47
-7
lines changed

src/ServiceStack.Text/Common/DateTimeSerializer.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,7 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr)
8080
|| dateTimeStr.Length == DefaultDateTimeFormatWithFraction.Length)
8181
{
8282
var unspecifiedDate = DateTime.Parse(dateTimeStr, CultureInfo.InvariantCulture);
83-
if (JsConfig.AssumeUtc)
84-
unspecifiedDate = DateTime.SpecifyKind(unspecifiedDate, DateTimeKind.Utc);
83+
unspecifiedDate = DateTime.SpecifyKind(unspecifiedDate, DateTimeKind.Utc);
8584

8685
return unspecifiedDate.Prepare();
8786
}
@@ -118,7 +117,8 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr)
118117

119118
try
120119
{
121-
return DateTime.Parse(dateTimeStr, null, DateTimeStyles.AssumeLocal).Prepare();
120+
var dateTime = DateTime.Parse(dateTimeStr, null, DateTimeStyles.AssumeLocal);
121+
return dateTime.Prepare();
122122
}
123123
catch (FormatException)
124124
{
@@ -446,7 +446,7 @@ public static DateTime ParseWcfJsonDate(string wcfJsonDate)
446446

447447
var offset = timeZone.FromTimeOffsetString();
448448
var date = unixTime.FromUnixTimeMs(offset);
449-
return new DateTimeOffset(date, offset).DateTime;
449+
return date;
450450
}
451451

452452
public static TimeZoneInfo GetLocalTimeZoneInfo()
@@ -478,7 +478,7 @@ public static void WriteWcfJsonDate(TextWriter writer, DateTime dateTime)
478478

479479
if (JsConfig.DateHandler == DateHandler.RFC1123)
480480
{
481-
writer.Write(dateTime.ToString("R", CultureInfo.InvariantCulture));
481+
writer.Write(dateTime.ToUniversalTime().ToString("R", CultureInfo.InvariantCulture));
482482
return;
483483
}
484484

src/ServiceStack.Text/DateTimeExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,12 @@ public static DateTime FromUnixTimeMs(this long msSince1970)
8888

8989
public static DateTime FromUnixTimeMs(this long msSince1970, TimeSpan offset)
9090
{
91-
return UnixEpochDateTimeUnspecified + TimeSpan.FromMilliseconds(msSince1970) + offset;
91+
return DateTime.SpecifyKind(UnixEpochDateTimeUnspecified + TimeSpan.FromMilliseconds(msSince1970) + offset, DateTimeKind.Local);
9292
}
9393

9494
public static DateTime FromUnixTimeMs(this double msSince1970, TimeSpan offset)
9595
{
96-
return UnixEpochDateTimeUnspecified + TimeSpan.FromMilliseconds(msSince1970) + offset;
96+
return DateTime.SpecifyKind(UnixEpochDateTimeUnspecified + TimeSpan.FromMilliseconds(msSince1970) + offset, DateTimeKind.Local);
9797
}
9898

9999
public static DateTime FromUnixTimeMs(string msSince1970)

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

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,15 @@ public void Can_serialize_nullable_DateTime()
384384

385385
JsConfig.Reset();
386386
}
387+
388+
[Test]
389+
public void Can_deserialize_LocalTime_using_ISO8601()
390+
{
391+
var date = DateTime.Now;
392+
var dateStr = date.ToJson();
393+
var fromDate = dateStr.FromJson<DateTime>();
394+
Assert.AreEqual(date.ToLocalTime().RoundToSecond(), fromDate.ToLocalTime().RoundToSecond());
395+
}
387396
}
388397

389398
[TestFixture]
@@ -436,6 +445,15 @@ public void DateTime_Is_Serialized_As_Utc_and_Deserialized_as_local()
436445
Assert.AreEqual(DateTimeKind.Utc, TypeSerializer.DeserializeFromString<TestObject>(TypeSerializer.SerializeToString<TestObject>(testObject)).Date.Kind);
437446
}
438447
}
448+
449+
[Test]
450+
public void Can_deserialize_LocalTime_using_RFC1123()
451+
{
452+
var date = DateTime.Now;
453+
var dateStr = date.ToJson();
454+
var fromDate = dateStr.FromJson<DateTime>();
455+
Assert.AreEqual(date.ToLocalTime().RoundToSecond(), fromDate.ToLocalTime().RoundToSecond());
456+
}
439457
}
440458

441459
[TestFixture]
@@ -483,6 +501,15 @@ public void Can_serialize_UnixEpoch_DateTimes(int whichDate)
483501
var nearestSec = TimeSpan.FromSeconds(1);
484502
Assert.That(fromJson.Date.RoundToSecond(), Is.EqualTo(dateTime.RoundToSecond()));
485503
}
504+
505+
[Test]
506+
public void Can_deserialize_LocalTime_using_UnixTime()
507+
{
508+
var date = DateTime.Now;
509+
var dateStr = date.ToJson();
510+
var fromDate = dateStr.FromJson<DateTime>();
511+
Assert.AreEqual(date.ToLocalTime().RoundToSecond(), fromDate.ToLocalTime().RoundToSecond());
512+
}
486513
}
487514

488515
[TestFixture]
@@ -531,4 +558,17 @@ public void Can_serialize_UnixEpochMs_DateTimes(int whichDate)
531558
Assert.That(fromJson.Date.RoundToMs(), Is.EqualTo(dateTime.RoundToMs()));
532559
}
533560
}
561+
562+
public class DefaultDateTimeests
563+
{
564+
[Test]
565+
public void Can_deserialize_LocalTime_using_default_DateHandler()
566+
{
567+
var date = DateTime.Now;
568+
var dateStr = date.ToJson();
569+
var fromDate = dateStr.FromJson<DateTime>();
570+
Assert.AreEqual(date.ToLocalTime().RoundToSecond(), fromDate.ToLocalTime().RoundToSecond());
571+
}
572+
}
573+
534574
}

0 commit comments

Comments
 (0)