簡體   English   中英

JodaTime - 檢查LocalTime是否在現在之后,現在是在另一個LocalTime之前

[英]JodaTime - Check if LocalTime is after now and now before another LocalTime

我試圖檢查當前時間是否在啟動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");
    }

任何想法如何解決這個問題?

基本上你需要檢查你的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;
        }
    }
}

LocalTime就是那個時代
它不存儲日期,因此您的問題根本不可能。

如果你想計算幾天的時間,你需要得到一個日期,你需要提防DST。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM