上午8点后使用Java8时间签入
我有以下情况: 我有一个类似于签入的应用程序,在早上8点之后(包括在内),如果用户在D-18点和D-8点之间没有签入,那么用户可以再次签入 例如: 最后签入->1月28日上午8:01 今天->1月29日上午7:50 无法在上面签入 最后签入->1月28日00:50上午 今天->1月28日09:10下午 可以在上面办理登机手续吗 最后签入->1月28日上午7:50 今天->1月28日上午9:50 可以在上面办理登机手续吗 最后签入->1月28日下午5:50 今天->1月28日06:50上午 无法在上面签入 我的验证功能:上午8点后使用Java8时间签入,java,java-8,date,Java,Java 8,Date,我有以下情况: 我有一个类似于签入的应用程序,在早上8点之后(包括在内),如果用户在D-18点和D-8点之间没有签入,那么用户可以再次签入 例如: 最后签入->1月28日上午8:01 今天->1月29日上午7:50 无法在上面签入 最后签入->1月28日00:50上午 今天->1月28日09:10下午 可以在上面办理登机手续吗 最后签入->1月28日上午7:50 今天->1月28日上午9:50 可以在上面办理登机手续吗 最后签入->1月28日下午5:50 今天->1月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);
}
}
我有两个问题,有没有比做这个比较更好的选择?这样做是否有我可能错过的差距或缺陷
谢谢 要求可以简化如下:最后一次入住日期时间需要在昨天上午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;
}
结果就是这样解决的:
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);
}
}
看起来你在要求我们测试你的方法。这似乎更适合。谢谢你的回复,但我只是想确保没有比我提供的更好的选择。谢谢Michael,我会在那里发布。一旦你发布到Code Review,请在这里留下链接。我想我有一些(次要的)评论。我一到家就试试看!非常感谢您的时间和帮助!对不起,我想我没说清楚。如果用户在“昨天上午8点”之前已签入,则可以签入。唯一的限制是,如果用户处于D-1 8AM和D 8AM之间,则无法签入。谢谢<代码>返回ChronoUnit.MINUTES.between(昨天上午8点,lastCheckinDate)>24*60 | | lastCheckinDate.isBefore(昨天上午8点)代码>这有意义吗?看起来是个不错的解决方案。不知道为什么要在7:59:59而不是8:00:00分开。