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

Posted

技术标签:

【中文标题】将通过 JDBC 检索到的 java.sql.Date 值转换为 java.time.LocalDate? [复制]【英文标题】:Converting java.sql.Date values retrieved via JDBC into java.time.LocalDate? [duplicate] 【发布时间】:2015-08-05 09:02:37 【问题描述】:

我正在尝试使用 UCanAccess 从 Microsoft Access 数据库中检索日期信息。我需要将它放在 tableview 的 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

【问题讨论】:

这看起来与 javafx 无关?对于 Date 到 LocalDate 的转换,请参阅***.com/q/21242110/203657 好的。我不确定@kleopatra 您可以检查您的 JDBC 驱动程序是否支持 java.time-package: 的 JDBC 4.2 转换:例如 getObject(idx, LocalDate.class)。但支持因驱动程序而异。 @MarkRotteveel - 好建议。但是,我只是用 UCanAccess 3.0.0 尝试过,不幸的是它不起作用。 附注new Date(2015-07-01)new Date(2007) (2015 - 7 - 1 = 2007) 相同,即 epoch 后 2007 毫秒,或 1970-01-01 00:00:02.007 UTC 【参考方案1】:
Optional<LocalDate> dateEchantillonnage = date == null
    ? Optional.empty()
    : Optional.of(date.toLocalDate());

【讨论】:

【参考方案2】:

修复 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) );

【讨论】:

【参考方案3】:

以下代码适用于我在 JDK 1.8.0_51 下的 UCanAccess 3.0.0:

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

【讨论】:

以上是关于将通过 JDBC 检索到的 java.sql.Date 值转换为 java.time.LocalDate? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JDBC ResultSet 检索为 ArrayList?

如何将通过 Timer.periodic 从 API 检索到的数据集成到 Flutter Cubit 项目中

如何将效果应用于 jQuery 数组中检索到的元素?

使用 swift 将 JSON 检索到的 int32 解析为核心数据类

如何将检索到的数据从 v-for 绑定到 Vuejs 中的数据对象?

java处理csv文件