java .time - Есть ли функция для определения номера определенного c дня (дня недели или дня месяца) между двумя днями? - PullRequest
0 голосов
/ 01 марта 2020

Так есть ли функция или что-то, что вы даете две даты и день недели (например, суббота) и она возвращает число суббот в промежутке между двумя датами?

проблема с попыткой использовать ChronoUnit.WEEKS.between и делением результата на 7 заключается в том, что он не будет работать, если у вас есть что-то вроде 4 days (потому что это не полная неделя ) или 10 дней (потому что это будет считаться как одна неделя) .

Другая идея, возможно, использовать al oop и проверить, если день суббота, но этот путь неэффективен и медленен для больших временных интервалов.

Что касается аналогичной функции, но вместо дня недели она считает число дней месяца (например, 15-го числа любого месяца) или дня года (например, 4 апреля каждого года) .

Если таких функций нет, какой может быть эффективный способ сделать это?

1 Ответ

1 голос
/ 02 марта 2020

Как прокомментировали другие, вам нужно написать свой собственный код. Но java .time и Java Потоки дают вам большую часть пути.

Метод LocalDate::datesUntil создает поток объектов LocalDate. Проверьте каждого на его DayOfWeek. Соберите хиты.

Что-то вроде этого непроверенного примера кода.

ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate start = LocalDate.now( z ) ;
LocalDate then = today.plusDays( 177 ) ;
Stream < LocalDate > dates = start.datesUntil( then ) ;
List < LocalDate > saturdays = 
        dates
        .filter( 
            date -> 
                date
                .getDayOfWeek()
                .equals( DayOfWeek.SATURDAY ) 
        )
        .collect( 
            Collectors.toList()
        )
; 

Вы выразили беспокойство по поводу эффективности. Я подозреваю, что вы попали в ловушку преждевременной оптимизации. Действительно ли ваше приложение выполняет эту операцию тысячи раз в минуту в течение всего дня? В противном случае производительность, скорее всего, не проблема.

Всегда сначала пишите простой простой код. Затем проведите эмпирическое тестирование с помощью Microbenchmarks Suite и с помощью профилировщика, чтобы убедиться в обоснованности ваших проблем.

...