2016-05-11 52 views
5

voglio creare un calendario con Java 8. Finora ho questo:Determinare in quale giorno della settimana è ogni data del mese

YearMonth yearMonthObject = YearMonth.of(year, month); 
int daysOfCurrentMonth = yearMonthObject.lengthOfMonth(); 

int i = 1; 
ArrayList<Integer> Dayes = new ArrayList<Integer>(); 
for(i=1; i<=daysOfCurrentMonth; i++){ 
    Dayes.add(i); 
} 

Dayes.forEach(value -> System.out.print(value)); 

che stampa i giorni del mese corrente (ad esempio maggio) .

Come posso determinare che 1 è domenica, 2 è lunedì, 3 è martedì, ..., 8 è domenica (settimana prossima), ecc.?

risposta

6

Hai un oggetto YearMonth. Per ogni giorno del mese, è possibile chiamare atDay(dayOfMonth) per restituire un LocalDate in quel giorno specifico del mese. Con questo LocalDate, quindi è possibile chiamare:

Come tale, si dovrebbe cambiare la vostra lista Dayes di tenere LocalDate s invece di Integer s, e quindi si può avere, per esempio:

YearMonth yearMonthObject = YearMonth.of(year, month); 
int daysOfCurrentMonth = yearMonthObject.lengthOfMonth(); 

ArrayList<LocalDate> dayes = new ArrayList<LocalDate>(); 
for(int i = 1; i <= daysOfCurrentMonth; i++){ 
    dayes.add(yearMonthObject.atDay(i)); 
} 

dayes.forEach(value -> System.out.println(value.getDayOfMonth() + " " + value.getDayOfWeek())); 

Ciò stamperà ogni giorno del mese seguito da il giorno corrispondente della settimana.

Come nota a margine, è possibile ottenere un valore di visualizzazione reale per il giorno della settimana (anziché lo name() dell'enumerazione precedente) chiamando lo getDisplayName(style, locale). Lo stile rappresenta come scrivere i giorni (forma lunga, forma breve ...) e le impostazioni internazionali sono le impostazioni internazionali da utilizzare per il nome visualizzato. Un esempio potrebbe essere:

value.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.ENGLISH) 

che restituirebbe in inglese il testo completo del giorno della settimana. Esempio di output per 04/2016 con il cambiamento di cui sopra:

1 Friday 
2 Saturday 
3 Sunday 
4 Monday 
5 Tuesday 
+0

La tua risposta è stata così dettagliata e la soluzione molto semplice. Grazie – dios231

0

questo può essere un po 'di una soluzione 'hack', ma se si sta cercando di fare un calendario per qualsiasi anno, si potrebbe essere necessario utilizzare una "data di ancoraggio" (ad esempio il 1 ° gennaio 1800 come un mercoledì). È quindi possibile calcolare il numero di giorni verificatisi tra il 1 ° gennaio 1800 e l'anno/mese/giorno corrente. Una volta capito quanti giorni sono trascorsi, utilizzando Modular 7 puoi determinare quale giorno è, quindi compilare il calendario per il mese da lì.

+0

Questo approccio ha il problema che "calcolare il numero di giorni accaduti tra il 1 ° gennaio 1800 e l'anno/mese/giorno corrente" può essere sorprendentemente complesso. I fusi orari stanno cambiando di volta in volta a causa di decisioni politiche. – Hulk