2010-07-17 12 views

Antwort

17

ist hier eine grobe Version mit Kommentaren die Schritte beschreiben:

// create a Calendar for the 1st of the required month 
int year = 2010; 
int month = Calendar.JANUARY; 
Calendar cal = new GregorianCalendar(year, month, 1); 
do { 
    // get the day of the week for the current day 
    int day = cal.get(Calendar.DAY_OF_WEEK); 
    // check if it is a Saturday or Sunday 
    if (day == Calendar.SATURDAY || day == Calendar.SUNDAY) { 
     // print the day - but you could add them to a list or whatever 
     System.out.println(cal.get(Calendar.DAY_OF_MONTH)); 
    } 
    // advance to the next day 
    cal.add(Calendar.DAY_OF_YEAR, 1); 
} while (cal.get(Calendar.MONTH) == month); 
// stop when we reach the start of the next month 
+0

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

+0

Es gab einen Fehler in der 'while' Bedingung, wo der letzte Tag des Monats verpasst wurde. Ich habe es jetzt behoben. – mikej

+0

Vielen Dank mikej – usman

8

java.time

Sie die Java 8 stream und die java.time package verwenden können. Hier wird ein IntStream von 1 zu der Anzahl der Tage im angegebenen Monat generiert. Dieser Stream wird im angegebenen Monat einem Stream von LocalDate zugeordnet und dann gefiltert, um den Samstag und Sonntag zu behalten.

import java.time.DayOfWeek; 
import java.time.DayOfWeek; 
import java.time.LocalDate; 
import java.time.Month; 
import java.time.YearMonth; 
import java.util.stream.IntStream; 

class Stackoverflow{ 
    public static void main(String args[]){ 

     int year = 2010; 
     Month month = Month.JANUARY; 

     IntStream.rangeClosed(1,YearMonth.of(year, month).lengthOfMonth()) 
       .mapToObj(day -> LocalDate.of(year, month, day)) 
       .filter(date -> date.getDayOfWeek() == DayOfWeek.SATURDAY || 
           date.getDayOfWeek() == DayOfWeek.SUNDAY) 
       .forEach(date -> System.out.print(date.getDayOfMonth() + " ")); 
    } 
} 

Wir finden, das gleiche Ergebnis wie die erste Antwort (2 3 9 10 16 17 23 24 30 31).

1

Sie könnte so versuchen:

int year=2016; 
int month=10; 
calendar.set(year, 10- 1, 1); 
int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); 
ArrayList<Date> sundays = new ArrayList<Date>();> 

for (int d = 1; d <= daysInMonth; d++) { 
     calendar.set(Calendar.DAY_OF_MONTH, d); 
     int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); 
     if (dayOfWeek==Calendar.SUNDAY) { 
      calendar.add(Calendar.DATE, d); 
      sundays.add(calendar.getTime()); 
     } 
} 
+0

FYI, diese notorisch lästigen und verwirrenden alten Datum-Zeit-Klassen sind jetzt Legacy, durch die java.time Klassen verdrängt. Vermeide die alten Klassen. –

+1

Noch relevant für Android-Entwickler. –

2

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.

Verwandte Themen