Die Answer by Lokni scheint korrekt zu sein, mit Bonuspunkten für Streams verwendet wird.
EnumSet
Verbesserungs Mein Vorschlag: EnumSet
. Diese Klasse ist eine äußerst effiziente Implementierung von Set
. Intern als Bitvektoren dargestellt, sind sie schnell auszuführen und benötigen nur sehr wenig Speicher.
Mit einem EnumSet
können Sie soft-code die Definition des Wochenendes durch eine Set<DayOfWeek>
übergeben.
Set<DayOfWeek> dows = EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY);
Demo mit der altmodischen Syntax ohne Streams. Sie könnten Lokni’s answer’s code anpassen, um eine EnumSet
in ähnlicher Weise zu verwenden.
YearMonth ym = YearMonth.of(2016 , Month.JANUARY) ;
int initialCapacity = ((ym.lengthOfMonth()/7) + 1) * dows.size() ; // Maximum possible weeks * number of days per week.
List<LocalDate> dates = new ArrayList<>( initialCapacity );
for (int dayOfMonth = 1; dayOfMonth <= ym.lengthOfMonth() ; dayOfMonth ++) {
LocalDate ld = ym.atDay(dayOfMonth) ;
DayOfWeek dow = ld.getDayOfWeek() ;
if(dows.contains(dow)) {
// Is this date *is* one of the days we care about, collect it.
dates.add(ld);
}
}
TemporalAdjuster
Sie können dort auch die TemporalAdjuster
Schnittstelle machen, die für die Klassen bereitstellt, die Datum-Zeit-Werte manipulieren. Die Klasse TemporalAdjusters
(beachten Sie den Plural s
) bietet mehrere praktische Implementierungen.
Das Projekt ThreeTen-Extra bietet Klassen, die mit java.time arbeiten. Dies beinhaltet eine TemporalAdjuster
Implementierung, Temporals.nextWorkingDay()
.
Sie können Ihre eigene Implementierung schreiben, um das Gegenteil zu tun, ein nextWeekendDay
temporal adjuster.
Beispiel funktioniert nicht richtig es gibt Ausgabe: 2,3,9,10,16,17,23,24,30, aber für Januar 2010 die Wochenendliste are2,3,9,10,16,17, 23,24,30,31. Bitte sagen Sie mir, wo ist der Profi – usman
Es gab einen Fehler in der 'while' Bedingung, wo der letzte Tag des Monats verpasst wurde. Ich habe es jetzt behoben. – mikej
Vielen Dank mikej – usman