我有一個方法,其中必須檢查 LocalDate 是否介于兩個 java.util.Date 值之間。java.util.Date 中有方法 after 和 before,LocalDate 中有方法 isAfter 和 isBefore。
我擁有的代碼片段是:
/**
* checks if date passed falls between start & end date
*
* @param date
* @param startDate
* @param endDate
* @return
*/
public static boolean isBetween(Date date, Date startDate, Date endDate) {
return (startDate == null || date.after(startDate) || date.equals(startDate))
&& (endDate == null || date.before(endDate) || date.equals(endDate));
}
API 中沒有方法可以比較..
uj5u.com熱心網友回復:
您需要決定許多角落和邊緣情況。這是一個鏡頭。
public static boolean isBetween(LocalDate date, Date startDate, Date endDate) {
ZoneId zone = ZoneId.systemDefault();
// Is before start?
if (startDate != null) {
LocalDate startLocalDate = startDate.toInstant().atZone(zone).toLocalDate();
if (date.isBefore(startLocalDate)) {
return false;
}
}
// Is after end?
if (endDate != null) {
LocalDate endLocalDate = endDate.toInstant().atZone(zone).toLocalDate();
if (date.isAfter(endLocalDate)) {
return false;
}
}
// If we end up here, the date is between start and end inclusive
return true;
}
我假設老式Date物件將在 JVM 的默認時區中進行解釋。一方面這是標準的,另一方面默認時區可以隨時更改,也可以從運行在同一 JVM 中的其他程式更改,因此這很脆弱。我正在丟棄如此解釋的日期的時間部分。無論時間是 00:00 還是 23:59:59.999,LocalDate如果日期一致,我認為在間隔內。您可能想要完全不同的行為。
如果您想將時間考慮在內,您可能應該將所有內容轉換為Instant或ZonedDateTime。
如您所見,將老式和現代類混合會導致相當多的復雜性。我正在轉換Date為LocalDate以利用 java.time,這反過來也變得更加復雜,因為Dates 可能是null.
uj5u.com熱心網友回復:
將 LocalDate 轉換為 String 并將此 String 轉換為 java.util.Date ,您可以使用您的方法。
將 LocalDate 轉換為字串:
LocalDate localDate = LocalDate.now();
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String localDateToString = localDate.format(dateFormatter1);
并將字串轉換為日期:
SimpleDateFormat formatter=new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss");
Date date1=formatter1.parse(sDate1);
將 LocalDate 轉換為 Date 后,您可以使用您的方法比較日期。
uj5u.com熱心網友回復:
您必須將 java.util.Date 轉換為 LocalDate 實體以進行比較。由于您必須將 LocalDate 與其他日期進行比較,因此在這里丟失時間部分似乎是一個合乎邏輯的妥協。
public static boolean isBetween(LocalDate localDate, Date start, Date end){
LocalDate startLocalDate = Instant.ofEpochMilli(start.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate endLocalDate = Instant.ofEpochMilli(end.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
return (localDate.isEqual(startLocalDate) || localDate.isEqual(endLocalDate)) || (localDate.isAfter(startLocalDate) && localDate.isBefore(endLocalDate));
}
我已將 endDate 作為包含上限。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/350713.html
