我有以下情况: 我有一个签到应用程序,该应用程序在上午8点(含)之后可以在D-1 8AM和D 8AM之间未签到的情况下再次签入。
例如:
LastCheckin-> 1月28日08:01 AM 今天-> 1月29日上午7:50 无法在上方签到
LastCheckin-> 1月28日00:50 AM 今天-> 1月28日09:10 PM 可以在上方签到
LastCheckin-> 1月28日上午7:50 今天-> 1月28日上午09:50 可以在上方签到
LastCheckin-> 1月28日下午5:50 今天-> 1月28日06:50 AM 无法在上方签到
我的验证功能:
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);
}
}
我有两个问题,还有没有比这种比较更好的选择了?这样可能有我遗漏的差距或缺陷吗?
谢谢!
答案 0 :(得分:4)
需求可以这样简化:上次签入日期时间必须是昨天上午8点之后的24小时。
所以方法可以这样写
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;
}
答案 1 :(得分:0)
最终以这种方式解决了这个问题:
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);
}
}