diff --git a/src/Uno.UI.Tests/Windows_Globalization/When_Calendar.cs b/src/Uno.UI.Tests/Windows_Globalization/When_Calendar.cs index bfe52391a5f13583913a2dc7a501ac83a74ea808..620258ea9bf6f73fd4f882e16f119459fdc3a0e4 100644 --- a/src/Uno.UI.Tests/Windows_Globalization/When_Calendar.cs +++ b/src/Uno.UI.Tests/Windows_Globalization/When_Calendar.cs @@ -13,6 +13,22 @@ namespace Uno.UI.Tests.Windows_Globalization [TestClass] public class When_Calendar { + [TestMethod] + public void When_DateTimeOffset_Is_Next_Day_If_Converted_To_Utc() + { + var calendar = new WG.Calendar(); + var offset = new DateTimeOffset(year: 2023, month: 5, day: 1, hour: 21, minute: 0, second: 0, TimeSpan.FromHours(-5)); + calendar.SetDateTime(offset); + // calendar.Day must be 1 here to match WinUI, **and also** not break CalendarView selection of "Today" + Assert.AreEqual(1, calendar.Day); + Assert.AreEqual(2, offset.UtcDateTime.Day); + + var comparer = new DirectUI.DateComparer(); + comparer.SetCalendarForComparison(calendar); + var result = comparer.CompareDay(offset, new DateTimeOffset(year: 2023, month: 5, day: 1, hour: 4, minute: 0, second: 0, TimeSpan.FromHours(0))); + Assert.AreEqual(0, result); + } + [TestMethod] public void When_Gregorian_FixedDate() { diff --git a/src/Uno.UI/DirectUI/DateComparer.cs b/src/Uno.UI/DirectUI/DateComparer.cs index 0fe6b9b7d2e141c5aa090a2753c883c1a3b2c26a..8fbb3aa9074510cdf9e7014044ac6f36fd2d02b8 100644 --- a/src/Uno.UI/DirectUI/DateComparer.cs +++ b/src/Uno.UI/DirectUI/DateComparer.cs @@ -103,10 +103,7 @@ namespace DirectUI global::System.Diagnostics.Debug.Assert(m_spCalendar is { }); - lhs = lhs.ToUniversalTime(); // UNO - rhs = rhs.ToUniversalTime(); // UNO - - long delta = lhs.Ticks - rhs.Ticks; + long delta = lhs.ToUniversalTime().Ticks - rhs.ToUniversalTime().Ticks; if (delta < 0) { delta = -delta; diff --git a/src/Uno.UWP/Globalization/Calendar.cs b/src/Uno.UWP/Globalization/Calendar.cs index 34268de424564ab39e35cadf36db9fad7d1dd53b..8740cf8b9d31c98df1d4ffe599e37752ade3df8f 100644 --- a/src/Uno.UWP/Globalization/Calendar.cs +++ b/src/Uno.UWP/Globalization/Calendar.cs @@ -190,28 +190,28 @@ namespace Windows.Globalization #region Read / Write _time public int Era { - get => _calendar.GetEra(_time.UtcDateTime); + get => _calendar.GetEra(_time.DateTime); [NotImplemented] set => global::Windows.Foundation.Metadata.ApiInformation.TryRaiseNotImplemented("Windows.Globalization.Calendar", "int Calendar.Era"); } public int Year { - get => _calendar.GetYear(_time.UtcDateTime); + get => _calendar.GetYear(_time.DateTime); set => AddYears(value - Year); } public int Month { - get => _calendar.GetMonth(_time.UtcDateTime); + get => _calendar.GetMonth(_time.DateTime); set => AddMonths(value - Month); } - public global::Windows.Globalization.DayOfWeek DayOfWeek => (global::Windows.Globalization.DayOfWeek)_calendar.GetDayOfWeek(_time.UtcDateTime); + public global::Windows.Globalization.DayOfWeek DayOfWeek => (global::Windows.Globalization.DayOfWeek)_calendar.GetDayOfWeek(_time.DateTime); public int Day { - get => _calendar.GetDayOfMonth(_time.UtcDateTime); + get => _calendar.GetDayOfMonth(_time.DateTime); set => AddDays(value - Day); } @@ -219,7 +219,7 @@ namespace Windows.Globalization { get { - var hour = _calendar.GetHour(_time.UtcDateTime); + var hour = _calendar.GetHour(_time.DateTime); if (hour < 12 || _clock == ClockIdentifiers.TwentyFourHour) { @@ -236,13 +236,13 @@ namespace Windows.Globalization public int Minute { - get => _calendar.GetMinute(_time.UtcDateTime); + get => _calendar.GetMinute(_time.DateTime); set => AddMinutes(value - Minute); } public int Second { - get => _calendar.GetSecond(_time.UtcDateTime); + get => _calendar.GetSecond(_time.DateTime); set => AddSeconds(value - Second); } @@ -281,7 +281,7 @@ namespace Windows.Globalization public int Nanosecond { - get => (int)(_calendar.GetMilliseconds(_time.UtcDateTime) * 1000); + get => (int)(_calendar.GetMilliseconds(_time.DateTime) * 1000); set => AddNanoseconds(value - Nanosecond); }