【问题标题】:Converting java.sql.Date values retrieved via JDBC into java.time.LocalDate? [duplicate]将通过 JDBC 检索到的 java.sql.Date 值转换为 java.time.LocalDate? [复制]
【发布时间】: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 的转换,请参阅stackoverflow.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

标签: java date jdbc java-8 ucanaccess


【解决方案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);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-10-15
        • 1970-01-01
        • 2014-04-19
        • 1970-01-01
        • 2014-02-10
        • 1970-01-01
        • 2011-08-29
        相关资源
        最近更新 更多