Заезд после 8 утра с Java8 Time - PullRequest
0 голосов
/ 28 января 2019

У меня есть следующий сценарий: у меня есть своеобразное приложение для регистрации, где после 8:00 (включительно) пользователь может выполнить повторную регистрацию, если пользователь не зарегистрировался в это время между D-1 8AM иD 8 AM.

Например:

LastCheckin -> 28 января 08:01 Сегодня -> 29 января 07:50 AM Регистрация невозможна выше

LastCheckin -> 28 января00:50 Сегодня -> 28 января 21:10. Возможна регистрация выше

LastCheckin -> 28 января 07:50 Сегодня -> 28 января 09:50. Возможна регистрация выше

LastCheckin-> 28 января 05:50 вечера Сегодня -> 28 января 06:50 Не могу зарегистрироваться выше

Моя функция проверки:

private Boolean validateLastCheckIn(LocalDateTime lastCheckinDate){
        LocalTime checkinTime = LocalTime.MIDNIGHT.plusHours(8);
        LocalDate today = LocalDate.now();
        LocalDateTime todayCheckinTime = LocalDateTime.of(today, checkinTime);

        //if trying to checkIn before limit, but on the same day (eg. after 12am)
        if(lastCheckinDate.getDayOfYear() == todayCheckinTime.getDayOfYear()){
            return lastCheckinDate.isAfter(todayCheckinTime);
        }else{
            //if its some other day in the past check
            LocalDate yesterdayCheckIn = LocalDate.now().minusDays(1);
            LocalDateTime yesterdayCheckinTime = LocalDateTime.of(yesterdayCheckIn, checkinTime);
            return lastCheckinDate.isBefore(yesterdayCheckinTime);
        }
    }

У меня есть два вопроса, есть ли другие?лучший вариант, чем делать это сравнение?Есть ли какие-то пробелы или недостатки, которые я мог упустить?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Закончилось так:

    private Boolean canCheckin(LocalDateTime nextValidCheckinTime){
        return timeFactory.now().isAfter(nextValidCheckinTime);
    }

    private LocalDateTime nextValidCheckinTime(LocalDateTime lastCheckinDate){
        LocalTime checkinTime = LocalTime.of(7, 59, 59);

        if (lastCheckinDate.toLocalTime().isBefore(checkinTime)) {
            return lastCheckinDate.withHour(7).withMinute(59).withSecond(0);
        } else {
            return lastCheckinDate.plusDays(1).withHour(7).withMinute(59).withSecond(59);
        }
    }
0 голосов
/ 28 января 2019

требования могут быть упрощены следующим образом: последняя проверка в datetime должна быть через 24 часа после вчерашнего дня в 8:00.
, поэтому метод можно написать так:

private Boolean validateLastCheckIn(LocalDateTime lastCheckinDate){
    LocalTime checkinTime = LocalTime.MIDNIGHT.plusHours(8);
    LocalDate yesterday = LocalDate.now().minusDays(1);
    LocalDateTime yesterdayAt8AM = LocalDateTime.of(yesterday, checkinTime);

    // between(start, end)
    return ChronoUnit.MINUTES.between(yesterdayAt8AM, lastCheckinDate) > 24*60;
}
...