From 5653d3c0909313047d166936912818ef8ab55fc5 Mon Sep 17 00:00:00 2001 From: Giedo Donkers Date: Tue, 25 May 2021 21:10:10 +0200 Subject: [PATCH 1/3] Added the deserialize fix and test for the UTC DateTime --- .../Serialization/DeserializerTest.cs | 19 +++++++++++++++++++ .../ScalarNodeDeserializer.cs | 5 ++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/YamlDotNet.Test/Serialization/DeserializerTest.cs b/YamlDotNet.Test/Serialization/DeserializerTest.cs index 0657e188..03f6ae98 100644 --- a/YamlDotNet.Test/Serialization/DeserializerTest.cs +++ b/YamlDotNet.Test/Serialization/DeserializerTest.cs @@ -19,6 +19,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. +using System; using System.Collections.Generic; using FluentAssertions; using Xunit; @@ -34,6 +35,7 @@ public void Deserialize_YamlWithInterfaceTypeAndMapping_ReturnsModel() { var yaml = @" name: Jack +momentOfBirth: 1983-04-21T20:21:03.0041599Z cars: - name: Mercedes year: 2018 @@ -48,6 +50,13 @@ public void Deserialize_YamlWithInterfaceTypeAndMapping_ReturnsModel() var person = sut.Deserialize(yaml); person.Name.Should().Be("Jack"); + person.MomentOfBirth.Kind.Should().Be(DateTimeKind.Utc); + person.MomentOfBirth.ToUniversalTime().Year.Should().Be(1983); + person.MomentOfBirth.ToUniversalTime().Month.Should().Be(4); + person.MomentOfBirth.ToUniversalTime().Day.Should().Be(21); + person.MomentOfBirth.ToUniversalTime().Hour.Should().Be(20); + person.MomentOfBirth.ToUniversalTime().Minute.Should().Be(21); + person.MomentOfBirth.ToUniversalTime().Second.Should().Be(3); person.Cars.Should().HaveCount(2); person.Cars[0].Name.Should().Be("Mercedes"); person.Cars[0].Spec.Should().BeNull(); @@ -60,6 +69,7 @@ public void Deserialize_YamlWithTwoInterfaceTypesAndMappings_ReturnsModel() { var yaml = @" name: Jack +momentOfBirth: 1983-04-21T20:21:03.0041599Z cars: - name: Mercedes year: 2018 @@ -81,6 +91,13 @@ public void Deserialize_YamlWithTwoInterfaceTypesAndMappings_ReturnsModel() var person = sut.Deserialize(yaml); person.Name.Should().Be("Jack"); + person.MomentOfBirth.Kind.Should().Be(DateTimeKind.Utc); + person.MomentOfBirth.ToUniversalTime().Year.Should().Be(1983); + person.MomentOfBirth.ToUniversalTime().Month.Should().Be(4); + person.MomentOfBirth.ToUniversalTime().Day.Should().Be(21); + person.MomentOfBirth.ToUniversalTime().Hour.Should().Be(20); + person.MomentOfBirth.ToUniversalTime().Minute.Should().Be(21); + person.MomentOfBirth.ToUniversalTime().Second.Should().Be(3); person.Cars.Should().HaveCount(2); person.Cars[0].Name.Should().Be("Mercedes"); person.Cars[0].Spec.EngineType.Should().Be("V6"); @@ -94,6 +111,8 @@ public class Person { public string Name { get; private set; } + public DateTime MomentOfBirth { get; private set; } + public IList Cars { get; private set; } } diff --git a/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs b/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs index 18f85feb..148c2bec 100644 --- a/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs +++ b/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs @@ -91,7 +91,10 @@ bool INodeDeserializer.Deserialize(IParser parser, Type expectedType, Func 27 ? DateTimeStyles.AssumeLocal : DateTimeStyles.None; + value = DateTime.Parse(scalar.Value, CultureInfo.InvariantCulture, style); break; default: From eb00bed6d7fe47ee9527bdd5e6db8425a8672518 Mon Sep 17 00:00:00 2001 From: Giedo Donkers Date: Thu, 10 Jun 2021 16:50:44 +0200 Subject: [PATCH 2/3] Replaced with `RoundtripKind` as suggested --- .../Serialization/NodeDeserializers/ScalarNodeDeserializer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs b/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs index 148c2bec..af793a96 100644 --- a/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs +++ b/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs @@ -92,7 +92,7 @@ bool INodeDeserializer.Deserialize(IParser parser, Type expectedType, Func 27 ? DateTimeStyles.AssumeLocal : DateTimeStyles.None; value = DateTime.Parse(scalar.Value, CultureInfo.InvariantCulture, style); break; From a980a34d70f134c1baa6b676d0f83cf22f0da33b Mon Sep 17 00:00:00 2001 From: Giedo Donkers Date: Sat, 12 Jun 2021 12:22:22 +0200 Subject: [PATCH 3/3] Tested best implementation of `DateTimeStyles.RoundtripKind` --- .../NodeDeserializers/ScalarNodeDeserializer.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs b/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs index af793a96..7de7d5a8 100644 --- a/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs +++ b/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs @@ -91,10 +91,7 @@ bool INodeDeserializer.Deserialize(IParser parser, Type expectedType, Func 27 ? DateTimeStyles.AssumeLocal : DateTimeStyles.None; - value = DateTime.Parse(scalar.Value, CultureInfo.InvariantCulture, style); + value = DateTime.Parse(scalar.Value, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind); break; default: