将通过 JDBC 检索到的 java.sql.Date 值转换为 java.time.LocalDate?

Converting java.sql.Date values retrieved via JDBC into java.time.LocalDate?

我正在尝试使用 UCanAccess 从 Microsoft Access 数据库中检索日期信息。我需要将它放在表视图的 LocalDate 列中,我正在这样做

Date date = res.getDate(3);
LocalDate dateEchantillonnage = LocalDate.parse( new SimpleDateFormat("yyyy-MM-dd").format(date) );

但这给我带来了两个问题:

第一个是它给出了一个 NullPointerException 因为有时日期可以为空,所以我想知道是否有办法解决这个问题。

第二个是我替换的时候

Date date = res.getDate(3);
LocalDate dateEchantillonnage = LocalDate.parse( new SimpleDateFormat("yyyy-MM-dd").format(date) );

Date date = new Date(2015-07-01);
LocalDate dateEchantillonnage = LocalDate.parse( new SimpleDateFormat("yyyy-MM-dd").format(date) );

它始终将日期显示为:1970-01-01

修复 NPE:

Date date = res.getDate(3);
LocalDate dateEchantillonnage = date == null
    ? null
    : LocalDate.parse( new SimpleDateFormat("yyyy-MM-dd").format(date) );

修复日期始终为 1970-01-01 的问题:

Date date = Date.valueOf("2015-07-01"); // You passed an int 2015-07-01 = 2007 :)
LocalDate dateEchantillonnage = date == null
    ? null
    : LocalDate.parse( new SimpleDateFormat("yyyy-MM-dd").format(date) );

以下代码适用于 JDK 1.8 下的 UCanAccess 3.0.0。0_51:

public static void main(String[] args) {
    String dbFilePath = "C:/Users/Public/UCanAccessDemo.accdb";
    String connUrl = "jdbc:ucanaccess://" + dbFilePath;
    try (Connection conn = DriverManager.getConnection(connUrl)) {
        String sql = "SELECT Date1 FROM DateTest ORDER BY ID";
        try (Statement st = conn.createStatement()) {
            try (ResultSet rs = st.executeQuery(sql)) {
                while (rs.next()) {
                    LocalDate dateEchantillonnage = null;
                    try {
                        dateEchantillonnage = rs.getDate(1).toLocalDate();
                    } catch (NullPointerException npe) {
                        // do nothing
                    }
                    System.out.println(dateEchantillonnage);
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace(System.err);
    }
}
Optional<LocalDate> dateEchantillonnage = date == null
    ? Optional.empty()
    : Optional.of(date.toLocalDate());