, , OP, - , ISO- , . , LocalDate.of(date.getYear() + 1, 1, 7) (. lastWeekOfYearOld(...)). , ( -), lastWeekOfYearCorrect(...). , - (. lastWeekOfYearAlternative(...).
public static void main(String[] args) {
System.out.println(
lastWeekOfYearOld(LocalDate.of(2015, 12, 31)));
System.out.println(
lastWeekOfYearOld(LocalDate.of(2016, 1, 1)));
System.out.println(
lastWeekOfYearCorrect(LocalDate.of(2015, 12, 31)));
System.out.println(
lastWeekOfYearCorrect(LocalDate.of(2016, 1, 1)));
System.out.println(
lastWeekOfYearAlternative(LocalDate.of(2015, 12, 31)));
System.out.println(
lastWeekOfYearAlternative(LocalDate.of(2016, 1, 1)));
}
private static LocalDate lastWeekOfYearOld(LocalDate date) {
return LocalDate.of(date.getYear() + 1, 1, 7)
.with(WeekFields.ISO.weekOfWeekBasedYear(), 1)
.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).minusWeeks(1);
}
private static LocalDate lastWeekOfYearCorrect(LocalDate date) {
date =
date.plus(1, IsoFields.WEEK_BASED_YEARS)
.with(DayOfWeek.MONDAY)
.with(WeekFields.ISO.weekOfWeekBasedYear(), 1);
return date.minusWeeks(1);
}
private static LocalDate lastWeekOfYearAlternative(LocalDate date) {
TemporalField woyField = WeekFields.ISO.weekOfWeekBasedYear();
date = date.with(woyField, woyField.rangeRefinedBy(date).getMaximum());
return date.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
}