From 0e2a613136987e5a8eb60aebb94df4b165a7a9e2 Mon Sep 17 00:00:00 2001 From: Evan Sarkar Date: Sat, 28 Mar 2026 04:49:48 +0530 Subject: [PATCH] fix: respect DateTimeKind in ToDateTimeOffset ToDateTimeOffset always used TimeZoneInfo.Local offset, which throws 0x80070057 when passed a DateTime with DateTimeKind.Utc. Now checks DateTimeKind and uses TimeSpan.Zero for UTC DateTimes. Fixes #330 --- src/Extensions/DateTimeExtensions.cs | 9 +++++++-- tests/DateTimeExtensionsTests.cs | 9 +++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Extensions/DateTimeExtensions.cs b/src/Extensions/DateTimeExtensions.cs index 153a8c71..3693a68d 100644 --- a/src/Extensions/DateTimeExtensions.cs +++ b/src/Extensions/DateTimeExtensions.cs @@ -8,13 +8,18 @@ namespace WinUI.TableView.Extensions; internal static class DateTimeExtensions { /// - /// Converts a DateTime to a DateTimeOffset using the local time zone. + /// Converts a DateTime to a DateTimeOffset, respecting the DateTime's Kind. + /// Uses UTC offset for UTC DateTimes and local offset otherwise. /// /// The DateTime to convert. /// A DateTimeOffset representing the same point in time as the DateTime. public static DateTimeOffset ToDateTimeOffset(this DateTime dateTime) { - return new DateTimeOffset(dateTime, TimeZoneInfo.Local.GetUtcOffset(dateTime)); + var offset = dateTime.Kind == DateTimeKind.Utc + ? TimeSpan.Zero + : TimeZoneInfo.Local.GetUtcOffset(dateTime); + + return new DateTimeOffset(dateTime, offset); } /// diff --git a/tests/DateTimeExtensionsTests.cs b/tests/DateTimeExtensionsTests.cs index 1a2159b9..2a450086 100644 --- a/tests/DateTimeExtensionsTests.cs +++ b/tests/DateTimeExtensionsTests.cs @@ -16,6 +16,15 @@ public void ToDateTimeOffset_FromDateTime_UsesLocalOffset() Assert.AreEqual(expected, dto); } + [TestMethod] + public void ToDateTimeOffset_FromUtcDateTime_UsesZeroOffset() + { + var dt = new DateTime(2024, 1, 2, 3, 4, 5, DateTimeKind.Utc); + var dto = dt.ToDateTimeOffset(); + var expected = new DateTimeOffset(dt, TimeSpan.Zero); + Assert.AreEqual(expected, dto); + } + [TestMethod] public void ToDateTimeOffset_FromTimeSpan_UsesTodayDate() {