将 java.sql.Date & java.util.Date 转换为 org.joda.time.LocalDate

2022-09-02 20:27:49

我正在尝试仔细细致地清理一些较旧的(生产)代码。我试图做的一件事是将我的所有用法转换为 和 。java.util.DateLocalDateDateTime

然而,我今晚在工作时注意到一个很大的障碍。我有这个代码:

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

这是有道理的,因为新实例不会为空(否可以是)。LocalDatenew Object()

但是,在这种情况下,在我的程序中,在许多情况下,日期传达了一些基本信息。在这种情况下,它显示订单1)是否打开(或未打开),2)是否已收到(或未收到)。null

因此,为了找到解决它的方法,我想我可以使用以下代码:

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时间,我基本上将从数据库获取对象所需的时间增加了一倍......java.sql.Date

LocalDate last = LocalDate.fromDateFields(results.getDate("LAST_DELIVERY_DATE"));
LocalDate next = LocalDate.fromDateFields(results.getDate("NEXT_DELIVERY_DATE"));

也不起作用,因为当它获得值时会抛出 a。fromDateFieldsNullPointerExceptionnull

所以,我的问题是:当你的程序需要空日期和joda时间时,你如何处理空日期?我错过了什么吗?有没有更简单的方法来完成我所追求的目标?


答案 1

使用三元运算符的代码不能那么简洁,因为您进行了两次数据库访问。考虑使用如下方法编写库:dateutil

    LocalDate convertToLocalDate(Date date) {
        if(date == null) return null;
        return new LocalDate(date);
    }

IMO以牺牲经常使用的轻量级静态方法为代价来清理此代码是一项很好的交易。

还要考虑不使用Java。例如,在Javascript中,你可以只使用而没有这个问题。我还听说Scala是一种很好的语言,它通过对类型更明确的支持来解决这个问题。只要你正在清理旧代码,不妨把它做好。||Nullable


答案 2

将 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();
        }

推荐