tl; dr
Для стандартной недели ISO 8601 используйте библиотеку YearWeek
из ThreeTen-Extra с троичным оператором.
YearWeek // Represents an entire week of a week-based-year.
.of( 2020 , 1 ) // Pass the number of the week-based-year (*not* calendar year), and a week number ranging from 1 to 52 or 1 to 53.
.is53WeekYear() // Every standard week-based-year has either 52 or 52 complete weeks.
? 53 // Ternary statement returns 53 if the predicate returns True, …
: 52 // … otherwise returns 52.
То есть YearWeek.of( 2020 , 1 ).is53WeekYear() ? 53 : 52
Определение «недели»
Вам необходимо определить неделю. В вашем примере кода определение недели зависит от текущего значения по умолчанию JVM Locale
. Так что ваши результаты могут отличаться во время выполнения.
В вашем коде также используются ужасные классы даты и времени, которые были заменены годами go современными java .time . Прекратите использовать GregorianCalendar
& Calendar
; они были заменены по уважительным причинам.
ISO 8601 неделя
ISO 8601 стандарт определяет неделю как:
- недели начинаются в понедельник , заканчиваются в воскресенье.
- Неделя № 1 имеет первый четверг календарного года.
Это определение означает:
- Первые и последние несколько дней в году недели могут быть последними / ведущими днями предыдущего / следующего календарного года.
- недельный год содержит 52 или 53 полных недели.
Если ваше определение отличается, см. Answer by Ole VV .
YearWeek:is53WeekYear
Если это соответствует вашему определению, то добавьте в ваш проект библиотеку ThreeTen-Extra , чтобы расширить встроенную функциональность java .time . Java 8 и позже. Затем у вас есть доступ к классу YearWeek
.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
YearWeek yearWeekNow = YearWeek.now( z ) ;
boolean is53WeekYear = yearWeekNow.is53WeekYear() ;
int weeksLong = yearWeekNow.is53WeekYear() ? 53 : 52 ;
Чтобы спросить о конкретном недельном году, просто произвольно выберите любую неделю года. Например, для основанного на неделе года 2020 мы просим указать неделю # 1.
int weeksLong = YearWeek.of( 2020 , 1 ).is53WeekYear() ? 53 : 52 ;
LocalDate weekStart = YearWeek.of( 2020 , 1 ).atDay( DayOfWeek.MONDAY ) ;
daysLong = 53
weekStart = 2019-12-30
Обратите внимание, как первый день недели 2020 года совпадает с календарным годом 2019.