[英]Java grails: Cannot cast object 'Mon Feb 12 00:00:00 PKT 2018' with class 'java.util.Date' to class 'org.joda.time.LocalDate'
[英]Converting java.sql.Date & java.util.Date to org.joda.time.LocalDate
我正在努力仔細並仔細地清理我的一些舊的(生產)代碼。 我要做的一件事是將我的java.util.Date
所有用法轉換為LocalDate
和DateTime
。
但是,當我工作的時候,我注意到今晚有一個很大的障礙。 我有這個代碼:
ResultSet results = stmt.executeQuery();
Date last = results.getDate("LAST_DELIVERY_DATE");
Date next = results.getDate("NEXT_DELIVERY_DATE");
boolean received;
if (last == null && next == null) {
received = true; // order is not open
} else if (last == null) {
received = false;
} else {
received = true;
}
我last
和next
轉換為:
LocalDate last = new LocalDate(results.getDate("LAST_DELIVERY_DATE"));
LocalDate next = new LocalDate(results.getDate("NEXT_DELIVERY_DATE"));
和Netbeans強調if == null
並說:
Unnecessary test for null - the expression is never null
這是有道理的,因為新的LocalDate
實例不會為null(沒有new Object()
可以)。
但是 ,在這種情況下以及在整個程序中的許多情況下, null
日期會傳達一些基本信息。 在這種情況下,它顯示訂單1)是否已打開(或未打開),2)是否已收到(或未收到)。
所以,試圖找到解決方法,我想我可以改為使用這段代碼:
LocalDate last = results.getDate("LAST_DELIVERY_DATE") == null? null : new LocalDate(results.getDate("LAST_DELIVERY_DATE"));
LocalDate next = results.getDate("NEXT_DELIVERY_DATE") == null? null : new LocalDate(results.getDate("NEXT_DELIVERY_DATE"));
但是,這對我來說似乎很難看? 另外,它會兩次調用“ResultSet#getDate()”函數,如果我錯了,請糾正我......對數據庫進行兩次調用,對嗎? 所以,現在將我的代碼轉換為joda-time我基本上將從數據庫中獲取java.sql.Date
對象所需的時間加倍...
LocalDate last = LocalDate.fromDateFields(results.getDate("LAST_DELIVERY_DATE"));
LocalDate next = LocalDate.fromDateFields(results.getDate("NEXT_DELIVERY_DATE"));
也不起作用,因為fromDateFields
在獲取null
值時拋出NullPointerException
。
所以,我的問題是:你如何最好地處理無效的日期時,你的程序就必須有空日期和喬達時間? 我錯過了什么嗎? 有沒有更簡單的方法來完成我追求的目標?
使用三元運算符的代碼不能精確地簡化,因為您兩次訪問數據庫。 考慮使用dateutil
方法編寫dateutil
庫:
LocalDate convertToLocalDate(Date date) {
if(date == null) return null;
return new LocalDate(date);
}
IMO以經常使用的輕量級靜態方法為代價來清理這些代碼是一個很好的交易。
還要考慮不使用Java。 在Javascript中你可以使用||
例如,沒有這個問題。 我還聽說Scala是一種很好的語言,可以通過更明確地支持Nullable
類型來解決這個問題。 只要你正在清理舊代碼,也可以做正確的事。
將java.util.Date轉換為org.joda.time.LocalDate
public static LocalDate convertUtilDateToLocalDate(Date date) {
if(date==null) return null;
DateTime dt = new DateTime(date);
return dt.toLocalDate();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.