diff --git a/ICD.Common.Utils.Tests/Json/DateTimeIsoConverterTest.cs b/ICD.Common.Utils.Tests/Json/DateTimeIsoConverterTest.cs new file mode 100644 index 0000000..c6d9713 --- /dev/null +++ b/ICD.Common.Utils.Tests/Json/DateTimeIsoConverterTest.cs @@ -0,0 +1,41 @@ +using System; +using ICD.Common.Utils.Json; +using Newtonsoft.Json; +using NUnit.Framework; + +namespace ICD.Common.Utils.Tests.Json +{ + [TestFixture] + public sealed class DateTimeIsoConverterTest : AbstractGenericJsonConverterTest + { + [Test] + public override void WriteJsonTest() + { + JsonSerializerSettings settings = new JsonSerializerSettings + { + DateParseHandling = DateParseHandling.None + }; + settings.Converters.Add(new DateTimeIsoConverter()); + + DateTime dateTime = new DateTime(2020, 1, 2, 3, 4, 5, DateTimeKind.Utc); + string serial = JsonConvert.SerializeObject(dateTime, settings); + + Assert.AreEqual("\"2020-01-02T03:04:05Z\"", serial); + } + + [Test] + public override void ReadJsonTest() + { + JsonSerializerSettings settings = new JsonSerializerSettings + { + DateParseHandling = DateParseHandling.None + }; + settings.Converters.Add(new DateTimeIsoConverter()); + + string serial = "\"2020-01-02T03:04:05Z\""; + DateTime dateTime = JsonConvert.DeserializeObject(serial, settings); + + Assert.AreEqual(new DateTime(2020, 1, 2, 3, 4, 5, DateTimeKind.Utc), dateTime); + } + } +} diff --git a/ICD.Common.Utils/Extensions/JsonReaderExtensions.cs b/ICD.Common.Utils/Extensions/JsonReaderExtensions.cs index 6588843..a568178 100644 --- a/ICD.Common.Utils/Extensions/JsonReaderExtensions.cs +++ b/ICD.Common.Utils/Extensions/JsonReaderExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Globalization; using ICD.Common.Properties; using Newtonsoft.Json; @@ -272,7 +273,7 @@ namespace ICD.Common.Utils.Extensions #endif string stringValue = extends.GetValueAsString(); - return DateTime.Parse(stringValue); + return DateTime.Parse(stringValue, null, DateTimeStyles.RoundtripKind); } /// diff --git a/ICD.Common.Utils/Json/DateTimeIsoConverter.cs b/ICD.Common.Utils/Json/DateTimeIsoConverter.cs index 42271eb..66e2584 100644 --- a/ICD.Common.Utils/Json/DateTimeIsoConverter.cs +++ b/ICD.Common.Utils/Json/DateTimeIsoConverter.cs @@ -1,4 +1,5 @@ using System; +using System.Globalization; using System.Text.RegularExpressions; using ICD.Common.Utils.Extensions; using Newtonsoft.Json; @@ -15,7 +16,12 @@ namespace ICD.Common.Utils.Json /// The calling serializer. public override void WriteJson(JsonWriter writer, DateTime value, JsonSerializer serializer) { - writer.WriteValue(value.ToIso()); + string iso = value.ToIso(); + + // Remove redundant ms + iso = iso.Replace(".0000000", ""); + + writer.WriteValue(iso); } /// @@ -48,11 +54,10 @@ namespace ICD.Common.Utils.Json // No TimeZoneInfo in CF, so now things get gross dateTime = DateTime.SpecifyKind(dateTime, DateTimeKind.Unspecified); - string iso = dateTime.ToIso() + match.Groups["zone"].Value; - return DateTime.Parse(iso); + serial = dateTime.ToIso() + match.Groups["zone"].Value; } - return DateTime.Parse(serial); + return DateTime.Parse(serial, null, DateTimeStyles.RoundtripKind); } } }