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.
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
GRAZIE A LOT UOMO !!!!! – Cristian
Forse usare 'dayOfWeek == Calendar.FRIDAY' in preferenza a 'dayOfWeek == 6', ecc.? –