diff --git a/src/Avalonia.Controls/Calendar/DateTimeHelper.cs b/src/Avalonia.Controls/Calendar/DateTimeHelper.cs index 9ad67889d6..a30a42f094 100644 --- a/src/Avalonia.Controls/Calendar/DateTimeHelper.cs +++ b/src/Avalonia.Controls/Calendar/DateTimeHelper.cs @@ -140,6 +140,14 @@ namespace Avalonia.Controls /// The first day of the week. /// The week number that falls in. public static int GetWeekOfYear(DateTime date, CalendarWeekRule rule, DayOfWeek firstDayOfWeek) - => CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(date, rule, firstDayOfWeek); + { + // .NET's Calendar.GetWeekOfYear does not correctly implement ISO 8601 for the combination + // of FirstFourDayWeek + Monday: late-December dates that belong to week 1 of the next year + // are incorrectly returned as week 53. Use ISOWeek for that specific combination. + if (rule == CalendarWeekRule.FirstFourDayWeek && firstDayOfWeek == DayOfWeek.Monday) + return ISOWeek.GetWeekOfYear(date); + + return CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(date, rule, firstDayOfWeek); + } } } diff --git a/tests/Avalonia.Controls.UnitTests/CalendarTests.cs b/tests/Avalonia.Controls.UnitTests/CalendarTests.cs index 05cf095340..017bc7c9c0 100644 --- a/tests/Avalonia.Controls.UnitTests/CalendarTests.cs +++ b/tests/Avalonia.Controls.UnitTests/CalendarTests.cs @@ -494,6 +494,8 @@ namespace Avalonia.Controls.UnitTests [InlineData(2023, 1, 2, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday, 1)] // 2022-12-31 is still in ISO week 52 of 2022 [InlineData(2022, 12, 31, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday, 52)] + // .NET bug: 2018-12-31 is a Monday and is ISO week 1 of 2019, not week 53 of 2018 + [InlineData(2018, 12, 31, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday, 1)] // US rule: week 1 always starts on Jan 1 [InlineData(2023, 1, 1, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Sunday, 1)] [InlineData(2023, 12, 31, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Sunday, 53)]