上午8点后使用Java8时间签入

上午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上午 无法在

我有以下情况: 我有一个类似于签入的应用程序,在早上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分开。