如何在Kotlin(或Java)中实现广播日历



我正试图编写一个应用程序,根据广播日历计算周数。维基百科的定义是:

广播日历中的每周从周一开始,到周日结束[…]每个广播月的第一周总是包含公历月的第一个

所以我认为我可以使用WeekFields类,并尝试以这种方式实现它:

val broadcastCalendar = WeekFields.of(DayOfWeek.MONDAY, 1)
val march1 = LocalDate.of(2022, 3, 1)
val weekOfMarch1 = march1.get(broadcastCalendar.weekOfYear())
println("March 1 2022: $weekOfMarch1") // 10

这在大多数情况下都很好,但当试图计算年底和年初的周数时,它失败了:

val lastDayOf2022 = LocalDate.of(2022, 12, 31)
val lastWeekOf2022 = lastDayOf2022.get(broadcastCalendar.weekOfYear())
val firstDayOf2023 = LocalDate.of(2023, 1, 1)
val firstWeekOf2023 = firstDayOf2023.get(broadcastCalendar.weekOfYear())
println("last week of 2022: $lastWeekOf2022") // 53
println("first week of 2023: $firstWeekOf2023") // 1

根据维基百科的定义,2022年的最后一周应该是52(12月19日至12月25日(,2023年的第一周应该是1(12月26日至1月1日(-见此处。

如何使用WeekFields(或任何其他方式(获取正确的周数?

从维基百科文章中的这些引文来看,这个日历系统似乎使用了基于周的年份。

例如,如果1月1日是周六,那么广播日历年将从12月27日的前一个星期一开始。

广播日历年可以有52周或53周。

因为这是,您应该使用weekOfWeekBasedYear:

val broadcastCalendar = WeekFields.of(DayOfWeek.MONDAY, 1)
val lastDayOf2022 = LocalDate.of(2022, 12, 31)
val lastWeekOf2022 = march1.get(broadcastCalendar.weekOfWeekBasedYear())
println(lastWeekOf2022) // 1

这代表了一年中周数的概念,其中周从一周中的固定日期开始,例如星期一,并且每周恰好属于一年。

最新更新