tl; dr
myLocalDate.with(
org.threeten.extra.Temporals.previousWorkingDay()
)
Использование java.time
В других ответах используются проблемные старые классы даты и времени, такие как Calendar
, которые сейчас унаследованы и вытеснены Java.классы времени.
Чтобы получить последние пять дней, сначала нужно получить «сегодня».
LocalDate
LocalDate
class представляет значение только для даты без времени суток и без часового пояса.
Часовой пояс имеет решающее значение при определении даты.В любой момент времени дата меняется по всему земному шару в зависимости от зоны.Например, через несколько минут после полуночи в Париж Франция - это новый день, в то время как "вчера" в Монреаль Квебек .
Укажите надлежащий часовой поясимя в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
.Никогда не используйте 3-4-буквенное сокращение, например EST
или IST
, так как они не истинных часовых поясов, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DayOfWeek
Чтобы узнать предыдущие дни, вы можете позвонить по номеру minusDays
для постепенного перемещения по датам в прошлом.
LocalDate yesterday = today.minusDays( 1 );
LocalDate dayBeforeYesterday = yesterday.minusDays( 1 );
Вы можете проверитькаждый LocalDate
объект для своего дня недели, используя перечисление DayOfWeek
.Этот класс предопределяет семь объектов, по одному на каждый день недели.Обратите внимание, что это реальные объекты, а не просто строки.Здесь вообще не нужно использовать строки.
Boolean isSaturday = myLocalDate.getDayOfWeek().equals( DayOfWeek.SATURDAY );
Boolean isSunday = myLocalDate.getDayOfWeek().equals( DayOfWeek.SUNDAY );
EnumSet
Более приятный и гибкий способ сравнения - с EnumSet
,реализация Set
, оптимизированная для перечислений, которая выполняется очень быстро и использует очень мало памяти.
EnumSet<DayOfWeek> weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY );
Используйте contains
для проверки вашего LocalDate
объекта DayOfWeek
.
Boolean isWeekend = weekend.contains( myLocalDate.getDayOfWeek() );
ThreeTen-Extra TemporalAdjuster
previousWorkingDay()
Проект ThreeTen-Extra расширяет классы java.time дополнительными функциями.В частности, здесь мы могли бы использовать previousWorkingDay
реализацию интерфейса TemporalAdjuster
.
Этот регулятор жестко задан для пропуска в субботу и воскресенье.Если вы хотите, чтобы учитывались другие значения дня недели, вы можете написать собственную реализацию TemporalAdjuster
.
В классах java.time используются неизменяемые объекты.Поэтому вместо того, чтобы изменять значения («мутировать») объекта, мы генерируем новый объект со значениями, основанными на оригинале.Поэтому здесь мы вызываем LocalDate::with
, передаем TemporalAdjuster
и генерируем свежее LocalDate
, которое представляет предыдущую дату при пропуске в субботу / воскресенье.
LocalDate previousWorkingDay =
myLocalDate.with(
org.threeten.extra.Temporals.previousWorkingDay()
)
;
Полный пример
Итак, давайте соберем все это вместе.
ZoneId z = ZoneId.of ( "America/Montreal" );
LocalDate today = LocalDate.now ( z );
Integer countDaysPrior = 5;
List<LocalDate> priorWeekdays = new ArrayList<> ( countDaysPrior ); // Set initial capacity to number of days to be collected.
LocalDate localDate = today; // Initialize to today. Exclusive, we want only prior days.
for ( int i = 1 ; i <= countDaysPrior ; i ++ ) {
localDate = localDate.with ( org.threeten.extra.Temporals.previousWorkingDay () ); // Decrement each day into the past, skipping over Saturday/Sunday.
priorWeekdays.add ( localDate );
}
System.out.println ( "Weekdays prior to " + today + " are: " + priorWeekdays );
Будние дни до 2017-02-27: [2017-02-24, 2017-02-23, 2017-02-22, 2017-02-21, 2017-02-20]
Полагаю, вы могли бы сделать этот код еще короче, используя Lambdas и Streams.
About 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 .