ich die letzte Lösung denken von OP gefunden ist immer noch nicht richtig, weil wir im Rahmen der ISO-Wochen-Termine verschieben, keine gewöhnlichen Kalenderdaten. Daher ist der Ausdruck LocalDate.of(date.getYear() + 1, 1, 7)
oft um die Jahresgrenze falsch (siehe die Beispielmethode lastWeekOfYearOld(...)
). Stattdessen müssen wir ein Kalenderjahr hinzufügen, nicht ein Kalenderjahr (gebunden an Januar-Dezember), das jetzt in der zweiten Methode lastWeekOfYearCorrect(...)
verwendet wurde. Ich zeigt auch eine andere korrekte Alternative basierend auf dem kontextsensitiven Wertebereich des Woche-of-Jahres-Bereichs (siehe Methode lastWeekOfYearAlternative(...)
.
public static void main(String[] args) {
System.out.println(
lastWeekOfYearOld(LocalDate.of(2015, 12, 31))); // 2015-12-28 (OK)
System.out.println(
lastWeekOfYearOld(LocalDate.of(2016, 1, 1))); // 2016-12-26 (Wrong)
System.out.println(
lastWeekOfYearCorrect(LocalDate.of(2015, 12, 31))); // 2015-12-28 (OK)
System.out.println(
lastWeekOfYearCorrect(LocalDate.of(2016, 1, 1))); // 2015-12-28 (OK)
System.out.println(
lastWeekOfYearAlternative(LocalDate.of(2015, 12, 31))); // 2015-12-28 (OK)
System.out.println(
lastWeekOfYearAlternative(LocalDate.of(2016, 1, 1))); // 2015-12-28 (OK)
}
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));
}
ich sieht okay, obwohl ich wahrscheinlich verwenden würde 'minusWeeks (1) 'statt' minusDays (7) ', und setze es in eine neue Zeile.Sie könnten möglicherweise Ihren' TemporalAdjuster' für 'lastWeekOfWeekYear' schreiben –
Eine Alternative (nicht unbedingt besser lesbar) wäre' date.with (lastDayOfYear()) .minusDays (7 - WeekFields.ISO.getMinimalDaysInFirstWeek()). mit (previousOrSame (MONDAY)) ' – assylias
@Oxolotl Ich schlage vor, dass Sie Ihre vorgeschlagene Lösung extrahieren und als Antwort posten. Sie können es später akzeptieren, um die Frage zu kennzeichnen als geschlossen.Komplett in Ordnung, um Ihre eigene Frage auf Stack Overflow zu beantworten.Oder –