Вы не должны использовать для этого собственную арифметику. Используйте встроенный функционал:
int week = nextMonday.get(ChronoField.ALIGNED_WEEK_OF_MONTH);
С датой из вашего кода это дает:
1
Это означает, что понедельник, который вы получили (5 февраля), является 1-м понедельником месяца. Также вам не нужны никакие WeekFields
, потому что первый понедельник месяца является первым понедельником месяца, независимо от того, какой день является первым днем недели или как нумеруются недели в году.
Арифметика дат часто сложна, и в ней легко ошибиться. Это также означает, что даже если вы, наконец, сделаете правильный расчет, читателю будет трудно убедить себя в правильности вашего кода. Поэтому всегда лучше использовать встроенную функциональность, которой мы доверяем тестирование и которая использует поясняющие имена, а не числа, такие как 1 и 7.
Вы можете быть удивлены тем, что используемое поле называется ALIGNED_WEEK_OF_MONTH
. Думайте о выровненных неделях как о неделе, которая начинается 1-го числа месяца, независимо от дня недели, и следующие недели сразу друг за другом. В феврале 2018 года первая выровненная неделя проходит с четверга, 1 февраля, по среду, 7 февраля. Следующие выровненные недели начинаются с четвергов, 8, 15 и 22 февраля. Очевидно, что первый понедельник месяца приходится на выровненную неделю 1, 2-й понедельник на выровненной неделе 2 и т. д. Поэтому можно использовать ALIGNED_WEEK_OF_MONTH
.
person
Ole V.V.
schedule
08.01.2018
java.time
что-то похожее наCalendar.DAY_OF_WEEK_IN_MONTH
? Для установки дня недели в месяце, например, для изменения понедельника на 3-й понедельник месяца:TemporalAdjusters.dayOfWeekInMonth
. Но для получения? - person Ole V.V.   schedule 08.01.2018