我正在嘗試檢查用戶選擇的日期范圍是否在資料庫中存在的日期范圍內。
例如
用戶選擇:
開始日期 : 24/09/2022
結束日期 : 30/09/2022
資料庫中的日期范圍是:
開始日期:28/09/2022
結束日期 : 30/09/2022
假設您在 28/09 → 30/09 之間預訂了一輛汽車,如果用戶想在 24/09 --> 30/09 之間預訂這輛車,那么應用程式應該通知他們該車在該日期已預訂,因為它是已經在 28--> 30 之間保留。
我的情況與此類似:Check if a date range is within a date range。只有那個問題是關于 C# 的,而我正在撰寫 Java 代碼。
到目前為止我的代碼:
boolean isFound = DateHelper.isWithinRange2Dates(
/*ENTERED BY USER*/
string2Date("24/09/2022"),
string2Date("30/09/2022"),
/*IN DATABASE*/
string2Date("28/09/2022"),
string2Date("30/09/2022"));
ToastUtils.showLong(isFound ? "FOUND" : "NOT FOUND");
使用方法:
public static boolean isWithinRange(Date selectedDate, Date startDate, Date endDate) {
return selectedDate.after(startDate) && (selectedDate.before(endDate) || DateUtils.isSameDay(selectedDate, endDate));
}
public static boolean isWithinRange2Dates(Date selectedStartDate, Date selectedEndDate, Date startDate, Date endDate) {
return isWithinRange(selectedStartDate, startDate, endDate) && isWithinRange(selectedEndDate, startDate, endDate);
}
@SuppressLint("SimpleDateFormat")
public static Date string2Date(String dateStr) {
try {
return new SimpleDateFormat("dd/MM/yyyy").parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
問題:
28/09 --> 30/09在24/09 --> 30/09之內,所以該方法應該為真
問題:
如何檢查選定的開始日期和結束日期是否在日期范圍內?
uj5u.com熱心網友回復:
tl;博士
org.threeten.extra.LocalDateRange.of
(
LocalDate.of( … ) ,
LocalDate.of( … )
)
.encloses
(
LocalDateRange.of
(
startJavaSqlDate.toLocalDate() ,
stopJavaSqlDate.toLocalDate()
)
)
避免遺留的日期時間類
您正在使用糟糕的日期時間類,這些類在幾年前被JSR 310 中定義的現代java.time類所取代。
該類中的許多設計缺陷之一Date是實際上有兩個 Date類:
java.util.Datejava.sql.Date
第一個代表在 UTC 中看到的時刻。第二個假裝只代表一個日期,沒有時間,也沒有偏移量或時區。但實際上,在判斷力極差的情況下,第二類從第一類延伸……所以它確實在內部代表了 UTC 中的一個時刻。凌亂?是的,一團糟。
LocalDate
您忽略了在您的問題中提及您正在使用哪個課程。所以我會選擇第二個,java.sql.Date。
當遞給一個java.sql.Date物件時,立即轉換為現代替換:LocalDate. 通過呼叫添加到舊類的新轉換方法來做到這一點。
LocalDate ld = myJavaSqlDate.toLocalDate() ;
LocalDateRange
要比較日期范圍,您可以自己撰寫代碼。但是為什么要打擾呢?將ThreeTen-Extra庫添加到您的專案中。這樣做可以讓您訪問LocalDateRange課程。該類提供了幾個方便的方法,例如contains, abuts, encloses,overlaps等。
LocalDateRange target =
LocalDateRange.of(
LocalDate.of( … ) ,
LocalDate.of( … )
)
;
… 和:
LocalDateRange selected =
LocalDateRange.of(
startJavaSqlDate.toLocalDate() ,
stopJavaSqlDate.toLocalDate()
)
;
相比。
boolean enclosed = target.encloses( selected ) ;
uj5u.com熱心網友回復:
您的 isWithin 范圍函式運算子 Precedence 錯誤。同時檢查 isSameDate 的結束日期和開始日期都缺失。在您的代碼中,如果用戶 startDate 與您的 dateRange 開始日期相似,或者用戶結束日期與 datarange 結束日期相似,則回傳 false。isWithinRange 函式的正確實作如下。
return (selectedDate.after(startDate) || DateUtils.isSameDay(selectedDate, startDate)) && (selectedDate.before(endDate) || DateUtils.isSameDay(selectedDate, endDate));
使用 || isWithinRange2Dates 函式的運算子 not && 如下。
return isWithinRange(selectedStartDate, startDate, endDate) || isWithinRange(selectedEndDate, startDate, endDate);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/510315.html
標籤:爪哇安卓日期约会时间
