ТЛ; др
Тестирование пары LocalDate
объектов с использованием класса org.threeten.extra.LocalDateRange
с TemporalAdjuster
с именем ta
, который определяет первый день недели.
LocalDateRange.of(
localDate1.with( ta ) ,
localDate1.with( ta ).plusWeeks( 1 )
)
.contains(
localDate2
)
ThreeTen-Extra
Проект ThreeTen-Extra добавляет дополнительные функциональные возможности к классам java.time , встроенным в Java (определяется JSR 310).
Среди добавленных классов - LocalDateRange
. Этот класс представляет промежуток времени, привязанный к временной шкале. Другими словами, пара LocalDate
объектов. Этот класс предлагает удобные методы для сравнения, такие как overlaps
, contains
и abuts
. Здесь нам нужно equals
.
Определите метод, в котором вы передаете две даты плюс первый день недели (объект перечисления DayOfWeek
).
Мы используем TemporalAdjuster
, найденный в классе TemporalAdjusters
, чтобы определить дату первого дня недели. Затем добавьте неделю, чтобы получить конец недели (для определения полуоткрытого промежутка времени).
Мы могли бы быть милыми и проверить, совпадают ли обе даты. Достойная проверка, если такой случай часто встречается в вашем приложении.
Для недели 2, давайте использовать однострочник в качестве альтернативного синтаксиса.
public boolean inSameWeek ( LocalDate localDate1 , LocalDate localDate2 , DayOfWeek firstDayOfWeek ) {
Objects.requireNonNull( localDate1 ) ; // … ditto for other arguments.
if( localDate1.isEqual( localDate2 ) ) { return true ; }
TemporalAdjuster ta = TemporalAdjusters.previousOrSame( firstDayOfWeek ) ;
LocalDate weekStart1 = localDate1.with( ta ) ;
LocalDate weekStop1 = weekStart1.plusWeeks( 1 ) ;
LocalDateRange week1 = LocalDateRange.of( weekStart1 , weekStop1 ) ;
LocalDateRange week2 =
LocalDateRange.of(
localDate2.with( ta ) ,
localDate2.with( ta ).plusWeeks( 1 )
)
;
// Compare the weeks.
return week1.equals( week2 ) ;
}
Или даже более компактный.
public boolean inSameWeek ( LocalDate localDate1 , LocalDate localDate2 , DayOfWeek firstDayOfWeek ) {
Objects.requireNonNull( localDate1 ) ; // … ditto for other arguments.
if( localDate1.isEqual( localDate2 ) ) { return true ; }
TemporalAdjuster ta = TemporalAdjusters.previousOrSame( firstDayOfWeek ) ;
return
LocalDateRange.of(
localDate1.with( ta ) ,
localDate1.with( ta ).plusWeeks( 1 )
)
.equals(
LocalDateRange.of(
localDate2.with( ta ) ,
localDate2.with( ta ).plusWeeks( 1 )
)
)
;
}
Нам действительно не нужна эта вторая неделя. Нам важно только, если первая определенная неделя содержит второй аргумент прошедшей даты.
public boolean inSameWeek ( LocalDate localDate1 , LocalDate localDate2 , DayOfWeek firstDayOfWeek ) {
Objects.requireNonNull( localDate1 ) ; // … ditto for other arguments.
if( localDate1.isEqual( localDate2 ) ) { return true ; }
TemporalAdjuster ta = TemporalAdjusters.previousOrSame( firstDayOfWeek ) ;
return
LocalDateRange.of(
localDate1.with( ta ) ,
localDate1.with( ta ).plusWeeks( 1 )
)
.contains(
localDate2
)
;
}
Используйте это.
LocalDate localDate = LocalDate.of( 2019 , Month.JANUARY , 23 ) ;
LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis") ) ;
boolean sameWeek = this.inSameWeek( localDate , today , DayOfWeek.SUNDAY ) ;
Предупреждение: я не запускал ни один из этих кодов.