簡體   English   中英

將java.sql.Date和java.util.Date轉換為org.joda.time.LocalDate

[英]Converting java.sql.Date & java.util.Date to org.joda.time.LocalDate

我正在努力仔細並仔細地清理我的一些舊的(生產)代碼。 我要做的一件事是將我的java.util.Date所有用法轉換為LocalDateDateTime

但是,當我工作的時候,我注意到今晚有一個很大的障礙。 我有這個代碼:

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;
}

lastnext轉換為:

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.

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