2010-07-17 15 views

Répondre

17

Voici une version approximative des commentaires décrivant les étapes:

// 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

l'échantillon ne fonctionne pas correctement il donne la production: 2,3,9,10,16,17,23,24,30, mais pour janvier 2010 la liste de fin de semaine sont2,3,9,10,16,17, 23,24,30,31. S'il vous plaît dites-moi où est le pro – usman

+0

Il y avait un bug dans la condition «while» où le dernier jour du mois était manqué. Je l'ai réparé maintenant. – mikej

+0

Merci beaucoup mikej – usman

8

java.time

Vous pouvez utiliser le Java 8 stream et le java.time package. Ici, un IntStream de 1 au nombre de jours dans le mois donné est généré. Ce flux est mappé à un flux de LocalDate dans le mois donné puis filtré pour rester le samedi et le dimanche. Nous trouvons le même résultat que la première réponse (2 3 9 10 16 17 23 24 30 31)

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() + " ")); 
    } 
} 

1

Vous pouvez essayer comme ceci:

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, ces vieilles classes de date-heure notoirement gênantes et confuses sont maintenant héritées, supplantées par les classes de java.time. Evite les vieilles classes. –

+1

Toujours pertinent pour les développeurs Android. –

2

Le Answer by Lokni semble correct, avec des points de bonus pour l'utilisation des flux.

EnumSet

Ma suggestion d'amélioration: EnumSet. Cette classe est une implémentation extrêmement efficace de Set. Représentés en interne sous forme de vecteurs binaires, ils sont rapides à exécuter et prennent très peu de mémoire. L'utilisation d'un EnumSet vous permet de définir la fin de semaine en passant un Set<DayOfWeek> à l'aide d'un EnumSet.

Set<DayOfWeek> dows = EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY); 

Démonstration utilisant la syntaxe à l'ancienne sans Streams. Vous pouvez adapter Lokni’s answer’s code pour utiliser un EnumSet d'une manière similaire.

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

Vous pouvez également utiliser l'interface TemporalAdjuster qui fournit des classes qui manipulent les valeurs date-heure. La classe TemporalAdjusters (notez le pluriel s) fournit plusieurs implémentations pratiques.

Le projet ThreeTen-Extra fournit des classes fonctionnant avec java.time. Cela inclut une implémentation TemporalAdjuster, Temporals.nextWorkingDay().

Vous pouvez écrire votre propre implémentation pour faire le contraire, un temporisateur nextWeekendDay.

Questions connexes