From 433e52bf0e3e7934eaeb8eb6301f9f073a878526 Mon Sep 17 00:00:00 2001 From: Marco Minerva Date: Fri, 12 Dec 2025 10:32:55 +0100 Subject: [PATCH] Fix UTC handling for TimeStamp column with ConvertToUtc=true Previously, the TimeStamp column stored local DateTime values even when ConvertToUtc was enabled, unless the column type was DateTimeOffset. This change ensures that UtcDateTime is used when ConvertToUtc is true, so timestamps are always stored in UTC as intended. Adds a unit test (Bugfix #659) to verify correct UTC storage and DateTimeKind. --- .../Output/StandardColumnDataGenerator.cs | 2 +- .../StandardColumnDataGeneratorTests.cs | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/Output/StandardColumnDataGenerator.cs b/src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/Output/StandardColumnDataGenerator.cs index 435dc741..81d362d5 100644 --- a/src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/Output/StandardColumnDataGenerator.cs +++ b/src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/Output/StandardColumnDataGenerator.cs @@ -77,7 +77,7 @@ private KeyValuePair GetTimeStampStandardColumnNameAndValue(LogE if (_columnOptions.TimeStamp.DataType == SqlDbType.DateTimeOffset) return new KeyValuePair(_columnOptions.TimeStamp.ColumnName, dateTimeOffset); - return new KeyValuePair(_columnOptions.TimeStamp.ColumnName, dateTimeOffset.DateTime); + return new KeyValuePair(_columnOptions.TimeStamp.ColumnName, _columnOptions.TimeStamp.ConvertToUtc ? dateTimeOffset.UtcDateTime : dateTimeOffset.DateTime); } private string RenderLogEventColumn(LogEvent logEvent) diff --git a/test/Serilog.Sinks.MSSqlServer.Tests/Sinks/MSSqlServer/Output/StandardColumnDataGeneratorTests.cs b/test/Serilog.Sinks.MSSqlServer.Tests/Sinks/MSSqlServer/Output/StandardColumnDataGeneratorTests.cs index 9c0b3265..d6e84b81 100644 --- a/test/Serilog.Sinks.MSSqlServer.Tests/Sinks/MSSqlServer/Output/StandardColumnDataGeneratorTests.cs +++ b/test/Serilog.Sinks.MSSqlServer.Tests/Sinks/MSSqlServer/Output/StandardColumnDataGeneratorTests.cs @@ -487,6 +487,29 @@ public void GetStandardColumnNameAndValueForTimeStampCreatesUtcConvertedTimeStam Assert.Equal(new TimeSpan(0), timeStampColumnOffset.Offset); } + [Trait("Bugfix", "#659")] + [Fact] + public void GetStandardColumnNameAndValueForTimeStampCreatesUtcDateTimeUsingUtcDateTimeProperty() + { + // Arrange + var options = new Serilog.Sinks.MSSqlServer.ColumnOptions + { + TimeStamp = { ConvertToUtc = true } + }; + var testDateTimeOffset = new DateTimeOffset(2020, 1, 1, 9, 0, 0, new TimeSpan(1, 0, 0)); // Timezone +1:00 + var logEvent = CreateLogEvent(testDateTimeOffset); + SetupSut(options, CultureInfo.InvariantCulture); + + // Act + var column = _sut.GetStandardColumnNameAndValue(StandardColumn.TimeStamp, logEvent); + + // Assert + Assert.IsType(column.Value); + var timestamp = (DateTime)column.Value; + Assert.Equal(testDateTimeOffset.Hour - 1, timestamp.Hour); + Assert.Equal(DateTimeKind.Utc, timestamp.Kind); + } + [Fact] public void GetStandardColumnNameAndValueForExceptionReturnsExceptionKeyValue() {