Ответ от Локни представляется правильным, с бонусными баллами за использование потоков.
EnumSet
Мое предложение по улучшению: EnumSet
. Этот класс является чрезвычайно эффективной реализацией Set
. Представленные внутри как битовые векторы, они быстро выполняются и занимают очень мало памяти.
Использование EnumSet
позволяет вам программный код определение выходных, передавая Set<DayOfWeek>
.
Set<DayOfWeek> dows = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY );
Демонстрация с использованием старомодного синтаксиса без потоков. Вы можете адаптировать код ответа Локни для использования EnumSet
аналогичным образом.
YearMonth ym = YearMonth.of( 2016 , Month.JANUARY ) ;
int initialCapacity = ( ( ym.lengthOfMonth() / 7 ) + 1 ) * dows.size() ; // Maximum possible weeks * number of days per week.
List<LocalDate> dates = new ArrayList<>( initialCapacity );
for (int dayOfMonth = 1; dayOfMonth <= ym.lengthOfMonth() ; dayOfMonth ++) {
LocalDate ld = ym.atDay( dayOfMonth ) ;
DayOfWeek dow = ld.getDayOfWeek() ;
if( dows.contains( dow ) ) {
// Is this date *is* one of the days we care about, collect it.
dates.add( ld );
}
}
TemporalAdjuster
Вы также можете использовать интерфейс TemporalAdjuster
, который предоставляет классы, которые манипулируют значениями даты и времени. Класс TemporalAdjusters
(обратите внимание на множественное число s
) предоставляет несколько удобных реализаций.
Проект ThreeTen-Extra предоставляет классы, работающие с java.time. Это включает в себя реализацию TemporalAdjuster
, Temporals.nextWorkingDay()
.
Вы можете написать собственную реализацию, чтобы сделать наоборот, nextWeekendDay
временный регулятор.
О java.time
Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .