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)]