Заезд после 8 утра с Java8 Time

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

Например:

LastCheckin -> 28 января 08:01 Сегодня -> 29 января 07:50 Не могу зарегистрироваться выше

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 ответа

Решение

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

    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);
        }
    }

Требования могут быть упрощены следующим образом: последняя проверка в 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;
}
Другие вопросы по тегам