JodaTime - 检查LocalTime是否在现在之后,现在是在另一个LocalTime之前

时间:2014-03-10 20:13:41

标签: java android time jodatime

我正在尝试检查当前时间是在开始LocalTime之后还是在另一端LocalTime之前,即开始时间加上11小时。如果开始时间是11:00(结束时间是22:00),这可以正常工作。但是,当我尝试比较16:00的开始时间和03:00的结束时间时,currentTime.isBefore(endTime)永远不会被记录,但它应该是。

LocalTime currentTime = LocalTime.now(); //21:14
LocalTime startTime = new LocalTime( 16, 00, 0, 0);
LocalTime endTime = startTime.plusHours(11); //03:00 Midnight

    if(currentTime.isAfter(startTime)){
        Log.v("Test", "After startTime");
    }

    if(currentTime.isBefore(endTime)){
        Log.v("Test", "Before endTime");
    }

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:9)

基本上,您需要检查startTimeendTime是否已被反转(即endTime是否在startTime之前)。如果是,那必须是“夜间”间隔,你应该把它看作是反过来的,并反转结果。

public boolean isWithinInterval(LocalTime start, LocalTime end, LocalTime time) {
    if (start.isAfter(end)) {
        return !isWithinInterval(end, start, time);
    }
    // This assumes you want an inclusive start and an exclusive end point.
    return start.compareTo(time) <= 0 &&
           time.compareTo(end) < 0;
}

现在唯一奇怪的是,如图所示,开始时间通常是包含的,结束时间是独占的 - 而如果我们反转结果(和参数),我们有一个包含的结束时间和一个独占的开始时间。因此,您可能希望明确处理这些案例:

public boolean isWithinInterval(LocalTime start, LocalTime end, LocalTime time) {
    if (start.isAfter(end)) {
        // Return true if the time is after (or at) start, *or* it's before end
        return time.compareTo(start) >= 0 ||
               time.compareTo(end) < 0;
    } else {
        return start.compareTo(time) <= 0 &&
               time.compareTo(end) < 0;
    }
}

(当然,您如何选择用于compareTo的目标和参数取决于您。有多种方法可以有效地编写相同的代码。)

简短而完整的例子:

import org.joda.time.LocalTime;

public class Test {
    public static void main(String[] args) {
        LocalTime morning = new LocalTime(6, 0, 0);
        LocalTime evening = new LocalTime(18, 0, 0);
        LocalTime noon = new LocalTime(12, 0, 0);
        LocalTime midnight = new LocalTime(0, 0, 0);
        System.out.println(isWithinInterval(morning, evening, noon)); // true
        System.out.println(
            isWithinInterval(morning, evening, midnight)); // false
        System.out.println(
            isWithinInterval(evening, morning, noon)); // false
        System.out.println(
            isWithinInterval(evening, morning, midnight)); // true
    }

    public static boolean isWithinInterval(LocalTime start, 
                                           LocalTime end,
                                           LocalTime time) {
        if (start.isAfter(end)) {
            // Return true if the time is after (or at) start,
            // *or* it's before end
            return time.compareTo(start) >= 0 ||
                time.compareTo(end) < 0;
        } else {
            return start.compareTo(time) <= 0 &&
                time.compareTo(end) < 0;
        }
    }
}

答案 1 :(得分:3)

LocalTime就是 - 时间 它没有存储日期,所以你的问题根本不可能。

如果你想计算几天的时间,你需要得到一个日期,你需要提防DST。