tl; dr
łatwe, z java.time.
Dla 3rd czwartku:
LocalDate.now().with( // Get today's date, then adjust.
TemporalAdjusters.dayOfWeekInMonth(3 , DayOfWeek.THURSDAY) // Define adjuster to move to third Thursday of same month.
) // Instantiates another `LocalDate` object (java.time uses immutable objects).
java.time
kłopotliwego starych klas date-time w pakiecie z najwcześniejszych wersjach Java są już nieaktualne, wyparta przez klasy java.time.
Klasa LocalDate
reprezentuje wartość tylko dla daty bez pory dnia i bez strefy czasowej.
LocalDate ld = LocalDate.of(2018 , Month.FEBRUARY , 17) ;
Dla każdego LocalDate
można dostosować do porządkowej występowania dzień-of-tydzień w tym samym miesiącu (ex: trzeci czwartek, 2 wtorek, itd.). Podaj dzień tygodnia, używając wyliczenia DayOfWeek
.
Aby dokonać korekty, należy zastosować implementacje TemporalAdjuster
znalezione w klasie TemporalAdjusters
.
TemporalAdjuster thirdThursdayAdjuster = TemporalAdjusters.dayOfWeekInMonth(3 , DayOfWeek.THURSDAY) ; // Third-Thursday.
zastosować ten regulator do dowolnego LocalDate
, tworząc kolejną LocalDate
obiekt.
LocalDate thirdThursday = ld.with(thirdThursdayAdjuster) ;
coś nieskończonego iteracyjnej z niego (.next() zwróci następny termin pasujący
Wystarczy przejść z jednego do drugiego LocalDate
. Można zadzwonić LocalDate::addMonths
.Lub jeśli masz do czynienia z miesiącem na raz, użyj klasy YearMonth
.
TemporalAdjuster thirdThursdayAdjuster = TemporalAdjusters.dayOfWeekInMonth(3 , DayOfWeek.THURSDAY) ; // Third-Thursday.
List<LocalDate> dozenThirdThursdays = new ArrayList<>(12) ;
YearMonth start = YearMonth.of(2018 , Month.MARCH) ;
for(int i = 1 ; i <= 12 ; i ++) {
YearMonth ym = start.plusMonths(i) ;
LocalDate firstOfMonth = ym.atDay(1) ;
LocalDate thirdThursday = firstOfMonth.with(thirdThursdayAdjuster) ;
dozenThirdThursdays.add(thirdThursday) ;
}
O java.time
Ramy java.time jest wbudowana w Java 8 i późniejszych. Te klasy zastępują kłopotliwe stare klasy dat-czasu, takie jak java.util.Date
, Calendar
, & SimpleDateFormat
.
Projekt Joda-Time, teraz w maintenance mode, zaleca migrację do klas 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, Java 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 Java SE 7
- Znaczna część funkcjonalności java.time jest back-przeniesiony do Java 6 & 7 w ThreeTen-Backport.
- Android
- Późniejsze wersje Androida wdrożeń wiązce klas java.time.
- Dla wcześniejszego systemu Android projekt ThreeTenABP dostosowuje ThreeTen-Backport (wymieniony powyżej). Zobacz How to use ThreeTenABP….
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.
Kołysałeś moje popołudnie - dziękuję kolego! –
Chociaż nie jest to wcale ważne, chcę tylko powiedzieć, że jest to drugi iterator, jaki kiedykolwiek napisałem, który obsługuje remove(), zazwyczaj uważam, że jest on zbyt nieporęczny, aby go obsłużyć. – Esko