2011-01-09 18 views
20

Ciò che fa questo codice è stampare le date della settimana corrente dal lunedì al venerdì. Funziona bene, ma voglio chiedere qualcos'altro: se oggi è sabato o domenica, voglio che mostri la settimana successiva. Come lo faccio?Come verificare se è sabato/domenica?

Ecco il mio codice di lavoro finora (grazie a 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); 
} 

Grazie mille! Ho davvero apprezzato come ho cercato la soluzione per ore ...

risposta

23
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); 
    } 
} 

uscita

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 

Se si vuole essere carina è possibile sostituire il if/then/else con

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

ma volevo davvero qualcosa di facilmente comprensibile e leggibile.

+0

grazie per la risposta! Se corro, dice che il giorno della settimana è 2 (è domenica qui). Quindi l'ho messo in quello per e il lunedì inizia con 3 .... è corretto? – Cristian

+0

GRAZIE A LOT UOMO !!!!! – Cristian

+6

Forse usare 'dayOfWeek == Calendar.FRIDAY' in preferenza a 'dayOfWeek == 6', ecc.? –

7

tl; dr codice

Nucleo concetto:

EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY) 
     .contains( 
      LocalDate.now(ZoneId.of("America/Montreal")) 
        .getDayOfWeek() 
     ) 

java.time

Il modo moderno è con le classi java.time.

L'enum DayOfWeek fornisce sette oggetti, per lunedì-domenica.

La classe LocalDate rappresenta un valore di sola data senza ora del giorno e senza fuso orario.

Un fuso orario è fondamentale per determinare una data. Per un dato momento, la data varia in tutto il mondo per zona. Ad esempio, pochi minuti dopo la mezzanotte in Paris France è un nuovo giorno mentre è ancora "ieri" in Montréal Québec.

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

Definire il fine settimana come un insieme di oggetti DayOfWeek. Notare che EnumSet è un'implementazione particolarmente veloce e con poca memoria di Set progettata per contenere gli oggetti Enum come DayOfWeek.

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

Ora possiamo verificare se oggi è un giorno feriale o un fine settimana.

Boolean todayIsWeekend = weekend.contains(dow); 

La domanda diceva che vogliamo saltare all'inizio della prossima settimana se si tratta di un fine settimana. Per fare ciò, utilizzare un TemporalAdjuster che fornisce classi che possono manipolare oggetti di data e ora. In java.time abbiamo immutable objects. Ciò significa che produciamo nuove istanze basate sui valori all'interno di un oggetto esistente piuttosto che alterare ("mutare") l'originale. La classe TemporalAdjusters (nota il plurale 's') fornisce diverse implementazioni pratiche di TemporalAdjuster compreso next(DayOfWeek).

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

Abbiamo soft-codice la lunghezza della settimana nel caso in cui la nostra definizione di fine settimana cambia mai.

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); 
} 

Vedere live code in IdeOne.com.


Chi java.time

Il quadro java.time è costruito in Java 8 e versioni successive. Queste classi soppiantano le fastidiose classi data legacy come java.util.Date, Calendar, & SimpleDateFormat.

Il progetto Joda-Time, ora in maintenance mode, consiglia la migrazione a java.time.

Per ulteriori informazioni, vedere Oracle Tutorial. E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310.

Dove ottenere le classi java.time?

  • Java SE 8 e SE 9 e successivamente
    • incorporato.
    • Parte dell'API Java standard con un'implementazione in bundle.
    • Java 9 aggiunge alcune funzionalità e correzioni minori.
  • Java SE 6 e SE 7
    • Molte delle funzionalità java.time è di back-porting per Java 6 .
  • Android

Il progetto ThreeTen-Extra java.time prolunga con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. È possibile trovare alcune classi utili come Interval, YearWeek, YearQuarter e more.