Java:如何检查给定时间是否介于两次之间?

时间:2017-06-13 10:12:46

标签: java time java-8 java-time

我想检查目标时间是否在两个给定时间之间,而不考虑使用Java8时间的日期。假设开始时间是" 21:30" ,结束时间是" 06:30" ,目标时间是" 03:00" ,所以程序应该返回true。

    @Test
    public void posteNuit()
    {
        DateTimeFormatter format = DateTimeFormatter.ofPattern("HH:mm");

        String s = "21:30";
        String e = "06:30";

        String t = "03:00";

        LocalTime startTime = LocalTime.parse(s, format);
        LocalTime endTime = LocalTime.parse(e, format);
        LocalTime targetTime = LocalTime.parse(t, format);

        if ( targetTime.isBefore(endTime) && targetTime.isAfter(startTime) ) {
            System.out.println("Yes! night shift.");
        } else {
            System.out.println("Not! night shift.");
        }
    }

2 个答案:

答案 0 :(得分:6)

您已经使用过LocalTime,它不会存储日期信息,只有时间。 然后,您尝试检查目标时间是否在开始时间之后(03:00之后21:30)。这句话是错误的。

您的开始时间应该在结束时间之前。

如果您需要处理夜班,请尝试以下操作:

    if (startTime.isAfter(endTime)) {
        if (targetTime.isBefore(endTime) || targetTime.isAfter(startTime)) {
            System.out.println("Yes! night shift.");
        } else {
            System.out.println("Not! night shift.");
        }
    } else {
        if (targetTime.isBefore(endTime) && targetTime.isAfter(startTime)) {
            System.out.println("Yes! without night shift.");
        } else {
            System.out.println("Not! without night shift.");
        }
    }

答案 1 :(得分:1)

在您的方案中,似乎如果startTime> endTime无论targetTime是什么,你都会返回true。

所以更新if语句:

if (( startTime.isAfter(endTime) && targetTime.isBefore(startTime)
        && targetTime.isAfter(endTime)  )
     || ( startTime.isBefore(endTime) && targetTime.isBefore(endTime) 
        && targetTime.isAfter(startTime) )) {