Мне потребуется немного аргументации, чтобы найти правильное решение: если я правильно понимаю, первая пятница февраля всегда на неделе 1. Неделя 1 начинается за 6 дней до этого.Если мы представим, что «неделя 0» начинается на 7 дней раньше, то номер недели для дня всегда будет числом целых недель с начала этой «недели 0» за 13 дней до первой пятницы февраля.Мы можем рассчитать это.
public static int getWeekNumber(LocalDate date) {
int year = date.getYear();
if (date.getMonth().equals(Month.JANUARY)) {
// calculate from February in previous year
year--;
}
LocalDate imaginaryWeek0Start = LocalDate.of(year, Month.FEBRUARY, 1)
.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY))
.minusDays(13);
long weekNo = ChronoUnit.WEEKS.between(imaginaryWeek0Start, date);
return Math.toIntExact(weekNo);
}
Давайте попробуем это с двумя примерами дат из вашего вопроса:
System.out.println(getWeekNumber(LocalDate.of(2019, Month.FEBRUARY, 1)));
System.out.println(getWeekNumber(LocalDate.of(2019, Month.FEBRUARY, 2)));
Это напечатано:
1
2
Если вы намеревались использовать класс Calendar
, я намеренно этого не делаю.Этот класс плохо спроектирован и давно устарел.Вместо этого я рекомендую LocalDate
и другие классы из java.time, современного Java-API даты и времени.
Ссылка: Руководство по Oracle: Date Time , объясняющее, какиспользовать java.time.