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

Commit 5e7adfe

Browse files
committed
Add fallback for invalid date formats
1 parent 7c67556 commit 5e7adfe

File tree

2 files changed

+33
-5
lines changed

2 files changed

+33
-5
lines changed

src/ServiceStack.Text/Common/DateTimeSerializer.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,13 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr)
129129

130130
if (dateTimeStr.Length == ShortDateTimeFormat.Length)
131131
{
132-
var manualDate = ParseManual(dateTimeStr);
133-
if (manualDate != null)
134-
return manualDate.Value;
132+
try
133+
{
134+
var manualDate = ParseManual(dateTimeStr);
135+
if (manualDate != null)
136+
return manualDate.Value;
137+
}
138+
catch {}
135139
}
136140

137141
try
@@ -191,14 +195,16 @@ private static string RepairXsdTimeSeparator(string dateTimeStr)
191195
if (parts.Length == 1)
192196
parts = dateTimeStr.SplitOnFirst(' ');
193197

194-
var dateParts = parts[0].Split('-');
198+
var dateParts = parts[0].Split('-','/');
195199
int hh = 0, min = 0, ss = 0, ms = 0;
196200
double subMs = 0;
197201
int offsetMultiplier = 0;
198202

199203
if (parts.Length == 1)
200204
{
201-
return new DateTime(int.Parse(dateParts[0]), int.Parse(dateParts[1]), int.Parse(dateParts[2]), 0, 0, 0, 0, dateKind);
205+
return dateParts.Length == 3 && dateParts[2].Length == "YYYY".Length
206+
? new DateTime(int.Parse(dateParts[2]), int.Parse(dateParts[1]), int.Parse(dateParts[0]), 0, 0, 0, 0, dateKind)
207+
: new DateTime(int.Parse(dateParts[0]), int.Parse(dateParts[1]), int.Parse(dateParts[2]), 0, 0, 0, 0, dateKind);
202208
}
203209
else if (parts.Length == 2)
204210
{

tests/ServiceStack.Text.Tests/AdhocModelTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Runtime.Serialization;
66
using System.Xml;
77
using NUnit.Framework;
8+
using ServiceStack.Text.Common;
89
using ServiceStack.Text.Jsv;
910

1011
namespace ServiceStack.Text.Tests
@@ -775,5 +776,26 @@ public void Can_serialize_ICollection()
775776
Assert.AreEqual(dto.Blah.Count, from.Blah.Count);
776777
from.PrintDump();
777778
}
779+
780+
[Test]
781+
public void Can_parse_different_3_part_date_formats()
782+
{
783+
Assert.That("28/06/2015".FromJsv<DateTime>().ToLongDateString(),
784+
Is.EqualTo("Sunday, June 28, 2015"));
785+
786+
Assert.That("6/28/2015".FromJsv<DateTime>().ToLongDateString(),
787+
Is.EqualTo("Sunday, June 28, 2015"));
788+
789+
DateTimeSerializer.OnParseErrorFn = (s, ex) =>
790+
{
791+
var parts = s.Split('/');
792+
return new DateTime(int.Parse(parts[2]), int.Parse(parts[0]), int.Parse(parts[1]));
793+
};
794+
795+
Assert.That("06/28/2015".FromJsv<DateTime>().ToLongDateString(),
796+
Is.EqualTo("Sunday, June 28, 2015"));
797+
798+
DateTimeSerializer.OnParseErrorFn = null;
799+
}
778800
}
779801
}

0 commit comments

Comments
 (0)