Browse Source

Make sure to use ISOWeek calculation where requiered.

pull/21311/head
timunie 2 weeks ago
parent
commit
43c2fe9bc4
  1. 10
      src/Avalonia.Controls/Calendar/DateTimeHelper.cs
  2. 2
      tests/Avalonia.Controls.UnitTests/CalendarTests.cs

10
src/Avalonia.Controls/Calendar/DateTimeHelper.cs

@ -140,6 +140,14 @@ namespace Avalonia.Controls
/// <param name="firstDayOfWeek">The first day of the week.</param>
/// <returns>The week number that <paramref name="date"/> falls in.</returns>
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);
}
}
}

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

Loading…
Cancel
Save