web-dev-qa-db-fra.com

Comment vérifier si c'est samedi / dimanche?

Ce code fait imprimer les dates de la semaine en cours du lundi au vendredi. Cela fonctionne bien, mais je veux demander autre chose: si aujourd'hui c'est samedi ou dimanche, je veux que ça se passe la semaine prochaine. Comment je fais ça?

Voici mon code de travail jusqu'à présent (grâce à StackOverflow !!):

// Get calendar set to current date and time
Calendar c = Calendar.getInstance();

// Set the calendar to monday of the current week
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

// Print dates of the current week starting on Monday to Friday
DateFormat df = new SimpleDateFormat("EEE dd/MM/yyyy");
for (int i = 0; i <= 4; i++) {
    System.out.println(df.format(c.getTime()));
    c.add(Calendar.DATE, 1);
}

Merci beaucoup! Je l'apprécie vraiment car je cherche la solution depuis des heures ...

26
Cristian
public static void main(String[] args) {
    Calendar c = Calendar.getInstance();
    // Set the calendar to monday of the current week
    c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

    // Print dates of the current week starting on Monday to Friday
    DateFormat df = new SimpleDateFormat("EEE dd/MM/yyyy");
    for (int i = 0; i <= 10; i++) {
        System.out.println(df.format(c.getTime()));
        int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
        if (dayOfWeek == Calendar.FRIDAY) { // If it's Friday so skip to Monday
            c.add(Calendar.DATE, 3);
        } else if (dayOfWeek == Calendar.SATURDAY) { // If it's Saturday skip to Monday
            c.add(Calendar.DATE, 2);
        } else {
            c.add(Calendar.DATE, 1);
        }

        // As Cute as a ZuZu pet.
        //c.add(Calendar.DATE, dayOfWeek > Calendar.THURSDAY ? (9 - dayOfWeek) : 1);
    }
}

Sortie

Mon 03/01/2011
Tue 04/01/2011
Wed 05/01/2011
Thu 06/01/2011
Fri 07/01/2011
Mon 10/01/2011
Tue 11/01/2011
Wed 12/01/2011
Thu 13/01/2011
Fri 14/01/2011
Mon 17/01/2011

Si vous voulez être mignon, vous pouvez remplacer le if/then/else par

c.add(Calendar.DATE, dayOfWeek > 5 ? (9 - dayOfWeek) : 1);

mais je voulais vraiment quelque chose de facile à comprendre et à lire.

25
Andrew T Finnell

tl; dr

Concept de code de base:

EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY )           // Instantiate a n implementation of `Set` highly optimized in both memory usage and execution speed for collecting enum objects. 
       .contains(                                             // Ask if our target `DayOfWeek` enum object is in our `Set`. 
            LocalDate.now( ZoneId.of( "America/Montreal" ) )  // Determine today’s date as seen by the people of a particular region (time zone).
                     .getDayOfWeek()                          // Determine the `DayOfWeek` enum constant representing the day-of-week of this date.
        )

Java.time

La manière moderne est avec les classes Java.time.

L'énumération DayOfWeek fournit sept objets, du lundi au dimanche.

La classe LocalDate représente une valeur de date uniquement sans heure et sans fuseau horaire.

Un fuseau horaire est crucial pour déterminer une date. Pour un moment donné, la date varie dans le monde par zone. Par exemple, quelques minutes après minuit dans Paris France est un nouveau jour alors qu'il est encore "hier" dans Montréal Québec .

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DayOfWeek dow = today.getDayOfWeek();

Définissez le week-end comme un ensemble d'objets DayOfWeek. Notez que EnumSet est une implémentation particulièrement rapide et à faible mémoire de Set conçue pour contenir Enum objets tels que DayOfWeek.

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

Maintenant, nous pouvons tester si aujourd'hui est un jour de semaine ou un week-end.

Boolean todayIsWeekend = weekend.contains( dow );

La question disait que nous voulons passer au début de la semaine prochaine si c'est un week-end. Pour ce faire, utilisez un TemporalAdjuster qui fournit des classes qui peuvent manipuler des objets date-heure. Dans Java.time, nous avons objets immuables . Cela signifie que nous produisons de nouvelles instances basées sur les valeurs d'un objet existant plutôt que de modifier ("muter") l'original. La classe TemporalAdjusters (notez le pluriel 's) fournit plusieurs implémentations pratiques de TemporalAdjuster dont next( DayOfWeek ).

DayOfWeek firstDayOfWeek = DayOfWeek.MONDAY ;
LocalDate startOfWeek = null ;
if( todayIsWeekend ) {
    startOfWeek = today.with( TemporalAdjusters.next( firstDayOfWeek ) );
} else {
    startOfWeek = today.with( TemporalAdjusters.previousOrSame( firstDayOfWeek ) );
}

Nous codons en douceur la durée de la semaine au cas où notre définition du week-end changerait un jour.

LocalDate ld = startOfWeek ;
int countDaysToPrint = ( DayOfWeek.values().length - weekend.size() );
for( int i = 1 ; i <= countDaysToPrint ; i++ ) {
    System.out.println( ld );
    // Set up the next loop.
    ld = ld.plusDays( 1 );
}

Voir code en direct sur IdeOne.com .

enter image description here


À propos de Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent l'ancien legacy date-time) des classes telles que Java.util.Date , Calendar , & SimpleDateFormat .

Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers Java.time.

Pour en savoir plus, consultez le Tutoriel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Où obtenir les classes Java.time?

Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour de futurs ajouts possibles à Java.time. Vous pouvez trouver ici des classes utiles telles que Interval , YearWeek , YearQuarter , et plus .

17
Basil Bourque