diff --git a/src/Squidex.Infrastructure.MongoDb/MongoDb/BsonJsonConverter.cs b/src/Squidex.Infrastructure.MongoDb/MongoDb/BsonJsonConverter.cs index e1e5b84e4..4c35c5377 100644 --- a/src/Squidex.Infrastructure.MongoDb/MongoDb/BsonJsonConverter.cs +++ b/src/Squidex.Infrastructure.MongoDb/MongoDb/BsonJsonConverter.cs @@ -6,6 +6,7 @@ // ========================================================================== using System; +using System.Globalization; using MongoDB.Bson; using Newtonsoft.Json.Linq; @@ -95,11 +96,18 @@ namespace Squidex.Infrastructure.MongoDb if (value is DateTime dateTime) { - return dateTime.ToString("yyyy-MM-ddTHH:mm:ssK"); + return dateTime.ToString("yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture); } else if (value is DateTimeOffset dateTimeOffset) { - return dateTimeOffset.UtcDateTime.ToString("yyyy-MM-ddTHH:mm:ssK"); + if (dateTimeOffset.Offset == TimeSpan.Zero) + { + return dateTimeOffset.UtcDateTime.ToString("yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture); + } + else + { + return dateTimeOffset.ToString("yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture); + } } else { diff --git a/src/Squidex.Infrastructure.MongoDb/MongoDb/BsonJsonWriter.cs b/src/Squidex.Infrastructure.MongoDb/MongoDb/BsonJsonWriter.cs index 5b485c624..558970951 100644 --- a/src/Squidex.Infrastructure.MongoDb/MongoDb/BsonJsonWriter.cs +++ b/src/Squidex.Infrastructure.MongoDb/MongoDb/BsonJsonWriter.cs @@ -135,12 +135,19 @@ namespace Squidex.Infrastructure.MongoDb public override void WriteValue(DateTime value) { - bsonWriter.WriteString(value.ToString("yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture)); + bsonWriter.WriteString(value.ToString("yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture)); } public override void WriteValue(DateTimeOffset value) { - bsonWriter.WriteString(value.ToString("yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture)); + if (value.Offset == TimeSpan.Zero) + { + bsonWriter.WriteString(value.UtcDateTime.ToString("yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture)); + } + else + { + bsonWriter.WriteString(value.UtcDateTime.ToString("yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture)); + } } public override void WriteValue(byte[] value) diff --git a/tests/Squidex.Infrastructure.Tests/MongoDb/BsonConverterTests.cs b/tests/Squidex.Infrastructure.Tests/MongoDb/BsonConverterTests.cs index d3d5b8ab4..4bd070235 100644 --- a/tests/Squidex.Infrastructure.Tests/MongoDb/BsonConverterTests.cs +++ b/tests/Squidex.Infrastructure.Tests/MongoDb/BsonConverterTests.cs @@ -87,7 +87,7 @@ namespace Squidex.Infrastructure.MongoDb Bool = true, Byte = 0x2, Bytes = new byte[] { 0x10, 0x12, 0x13 }, - DateTimeOffset = DateTime.UtcNow.Date, + DateTimeOffset = DateTime.Today, DateTime = DateTime.UtcNow.Date, Float32 = 32.5f, Float64 = 32.5d, @@ -126,17 +126,35 @@ namespace Squidex.Infrastructure.MongoDb } [Fact] - public void Should_serialize_to_iso() + public void Should_serialize_datetime_to_iso() { source.DateTime = new DateTime(2012, 12, 12, 12, 12, 12, DateTimeKind.Utc); - source.DateTimeOffset = new DateTime(2012, 12, 12, 12, 12, 12, DateTimeKind.Utc); var target = JObject.FromObject(source).ToBson(); Assert.Equal("2012-12-12T12:12:12Z", target["DateTime"].ToString()); + } + + [Fact] + public void Should_serialize_datetimeoffset_to_iso_utc() + { + source.DateTimeOffset = new DateTime(2012, 12, 12, 12, 12, 12, DateTimeKind.Utc); + + var target = JObject.FromObject(source).ToBson(); + Assert.Equal("2012-12-12T12:12:12Z", target["DateTimeOffset"].ToString()); } + [Fact] + public void Should_serialize_datetimeoffset_to_iso_utc_with_offset() + { + source.DateTimeOffset = new DateTimeOffset(2012, 12, 12, 12, 12, 12, TimeSpan.FromHours(2)); + + var target = JObject.FromObject(source).ToBson(); + + Assert.Equal("2012-12-12T12:12:12+02:00", target["DateTimeOffset"].ToString()); + } + [Fact] public void Should_write_problematic_object() {