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

Commit 0e33332

Browse files
committed
Also return dates without time as UTC when AssumeUtc=true
1 parent ae278b8 commit 0e33332

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

src/ServiceStack.Text/Common/DateTimeSerializer.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,13 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr)
116116
return PclExport.Instance.ParseXsdDateTimeAsUtc(dateTimeStr);
117117
}
118118

119+
if (dateTimeStr.Length == ShortDateTimeFormat.Length)
120+
{
121+
var manualDate = ParseManual(dateTimeStr);
122+
if (manualDate != null)
123+
return manualDate.Value;
124+
}
125+
119126
try
120127
{
121128
var dateTime = DateTime.Parse(dateTimeStr, null, DateTimeStyles.AssumeLocal);
@@ -150,10 +157,12 @@ private static string RepairXsdTimeSeparator(string dateTimeStr)
150157

151158
public static DateTime? ParseManual(string dateTimeStr)
152159
{
153-
if (dateTimeStr == null || dateTimeStr.Length < "YYYY-MM-DD".Length)
160+
if (dateTimeStr == null || dateTimeStr.Length < ShortDateTimeFormat.Length)
154161
return null;
155162

156-
var dateKind = DateTimeKind.Utc;
163+
var dateKind = JsConfig.AssumeUtc || JsConfig.AlwaysUseUtc
164+
? DateTimeKind.Utc
165+
: DateTimeKind.Local;
157166
if (dateTimeStr.EndsWith(XsdUtcSuffix))
158167
{
159168
dateTimeStr = dateTimeStr.Substring(0, dateTimeStr.Length - 1);
@@ -168,7 +177,11 @@ private static string RepairXsdTimeSeparator(string dateTimeStr)
168177
double subMs = 0;
169178
int offsetMultiplier = 0;
170179

171-
if (parts.Length == 2)
180+
if (parts.Length == 1)
181+
{
182+
return new DateTime(int.Parse(dateParts[0]), int.Parse(dateParts[1]), int.Parse(dateParts[2]), 0, 0, 0, 0, dateKind);
183+
}
184+
else if (parts.Length == 2)
172185
{
173186
var timeStringParts = parts[1].Split('+');
174187
if (timeStringParts.Length == 2)

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -677,5 +677,14 @@ public void Does_serialize_Dates_without_time_as_UTC_when_UseUtc()
677677
Assert.That(date.Kind, Is.EqualTo(DateTimeKind.Utc));
678678
Assert.That(date.ToString("yyyy-MM-dd"), Is.EqualTo("2000-01-01"));
679679
}
680+
681+
[Test]
682+
public void Does_serialize_Dates_without_time_as_UTC_when_AssumeUtc()
683+
{
684+
JsConfig.AssumeUtc = true;
685+
var date = "2000-01-01".FromJson<DateTime>();
686+
Assert.That(date.Kind, Is.EqualTo(DateTimeKind.Utc));
687+
Assert.That(date.ToString("yyyy-MM-dd"), Is.EqualTo("2000-01-01"));
688+
}
680689
}
681690
}

0 commit comments

Comments
 (0)