tl; dr Kod
Rdzeń pojęcia:
EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY)
.contains(
LocalDate.now(ZoneId.of("America/Montreal"))
.getDayOfWeek()
)
java.time
Nowoczesny sposób jest z klasami java.time.
Wyliczenie DayOfWeek
zawiera siedem obiektów, od poniedziałku do niedzieli.
Klasa LocalDate
reprezentuje wartość tylko dla daty bez pory dnia i bez strefy czasowej.
Strefa czasowa ma kluczowe znaczenie przy ustalaniu daty. W danym momencie data zmienia się na całym świecie według strefy. Na przykład kilka minut po północy w Paris France jest nowy dzień, a jednocześnie "wczoraj" w Montréal Québec.
ZoneId z = ZoneId.of("America/Montreal");
LocalDate today = LocalDate.now(z);
DayOfWeek dow = today.getDayOfWeek();
Określ weekend jako zbiór obiektów DayOfWeek
. Zauważ, że EnumSet
to szczególnie szybka i mało pamięci implementacja Set
zaprojektowana do przechowywania obiektów Enum
, takich jak DayOfWeek
.
Set<DayOfWeek> weekend = EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY);
Teraz możemy sprawdzić, czy dziś jest dzień tygodnia czy weekend.
Boolean todayIsWeekend = weekend.contains(dow);
Pytanie brzmiało, że chcemy skoczyć na początek następnego tygodnia, jeśli jest to weekend. Aby to zrobić, użyj parametru TemporalAdjuster
, który zapewnia klasy, które mogą manipulować obiektami typu data-czas. W java.time mamy immutable objects. Oznacza to, że tworzymy nowe instancje oparte na wartościach wewnątrz istniejącego obiektu, zamiast zmieniać ("mutować") oryginał. Klasa TemporalAdjusters
(zwróć uwagę na liczbę mnogą "s") zapewnia kilka użytecznych implementacji TemporalAdjuster
, w tym next(DayOfWeek)
.
DayOfWeek firstDayOfWeek = DayOfWeek.MONDAY ;
LocalDate startOfWeek = null ;
if(todayIsWeekend) {
startOfWeek = today.with(TemporalAdjusters.next(firstDayOfWeek));
} else {
startOfWeek = today.with(TemporalAdjusters.previousOrSame(firstDayOfWeek));
}
Kod miękki długości tygodnia na wypadek, gdyby nasza definicja weekendu kiedykolwiek się zmieniała.
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);
}
Zobacz live code in IdeOne.com.
O java.time
Ramy java.time jest wbudowana w Java 8 i późniejszych. Klasy te zastępują kłopotliwe stare klasy z datami, takie jak java.util.Date
, Calendar
, & SimpleDateFormat
.
Projekt Joda-Time, teraz w maintenance mode, zaleca migrację do java.time. Aby uzyskać więcej informacji, zobacz
. I wyszukaj Stack Overflow dla wielu przykładów i objaśnień. Specyfikacja to JSR 310.
Gdzie można uzyskać lekcje java.time?
- Java SE 8 i SE 9 a później
- wbudowanej.
- Część standardowego interfejsu API języka Java z pakietem implementacji.
- Java 9 dodaje kilka drobnych funkcji i poprawek.
- Java SE 6 i SE 7
- Znaczna część funkcjonalności java.time jest back-przeniesiony do Java 6 & 7 w ThreeTen-Backport.
- Android
- Projekt ThreeTenABP dostosowuje ThreeTen-backportu (wymienione powyżej) Androida szczegółowo.
- Zobacz How to use….
Projekt ThreeTen-Extra rozciąga java.time z dodatkowych zajęć. Ten projekt jest poligonem wskazującym na możliwe przyszłe dodatki do java.time. Możesz znaleźć tutaj kilka użytecznych klas, takich jak Interval
, YearWeek
, YearQuarter
i more.
dzięki za odpowiedź! Jeśli go uruchomię, oznacza to, że dzień tygodnia to 2 (tutaj jest niedziela). Więc włożyłem to do tego i poniedziałek zaczyna się od 3 .... czy to prawda? – Cristian
DZIĘKI DUŻO CZŁOWIEK !!!!! – Cristian
Może użyjesz "dayOfWeek == Calendar.FRIDAY" zamiast "dayOfWeek == 6" itd.? –