ТЛ; др
Легко, с java.time .
за 3-й четверг:
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
Тревожные старые классы даты и времени, включенные в ранние версии Java, теперь устарели, заменены классами java.time.
Класс LocalDate
представляет значение только для даты без времени суток и без часового пояса.
LocalDate ld = LocalDate.of( 2018 , Month.FEBRUARY , 17 ) ;
Для любого LocalDate
вы можете настроить порядковое вхождение дня недели в том же месяце (например: третий четверг, 2-й вторник и т. Д.). Укажите день недели, используя DayOfWeek
enum.
Чтобы выполнить корректировку, используйте TemporalAdjuster
реализаций, найденных в TemporalAdjusters
классе.
TemporalAdjuster thirdThursdayAdjuster = TemporalAdjusters.dayOfWeekInMonth( 3 , DayOfWeek.THURSDAY ) ; // Third-Thursday.
Примените этот регулятор к любому LocalDate
, создав другой объект LocalDate
.
LocalDate thirdThursday = ld.with( thirdThursdayAdjuster ) ;
что-то вроде бесконечного итератора из него (.next () вернет следующую дату, соответствующую
Просто переходите от одного LocalDate
к другому. Вы можете позвонить LocalDate::addMonths
. Или, если вы имеете дело с месяцем за раз, используйте класс 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 ) ;
}
О java.time
Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют старые классные устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и & SimpleDateFormat
.
Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .