Заезд после 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;
}