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

标签 java sql jodatime sql-date-functions

我正在尝试仔细、细致地清理我的一些旧(生产)代码。我想做的一件事是将我对 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 实例不会为空(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

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

最佳答案

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

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

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

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

关于java - 将 java.sql.Date 和 java.util.Date 转换为 org.joda.time.LocalDate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20736449/

相关文章:

java - 按钮移至错误位置

java - 使用 Seam 中的方法进行重定向

sql - Bigquery SQL 用于生成混合级因子设计数组 - 笛卡尔积

java - 关于 Datetime 类型的 SQL 查询帮助

sql - SQL语句中过程的并行执行(Oracle 11g)

java - 如何将 Joda 库的 DateTime 舍入到最接近的 X 分钟?

java - Spring获取泛型类型类

java - Java/Clojure 中的 XML 解析 - 使用 XSD 进行类型强制转换?

java - Joda Time 不能减去一小时

java - Date - Java 到 Sql 表以及 sql 表通过 Joda Time 到 Java