早上8点后使用Java8 Time签入

时间:2019-01-28 09:55:41

标签: java java-8 java-date

我有以下情况: 我有一个签到应用程序,该应用程序在上午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);
        }
    }

我有两个问题,还有没有比这种比较更好的选择了?这样可能有我遗漏的差距或缺陷吗?

谢谢!

2 个答案:

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