【问题标题】:String to Date Java字符串到日期 Java
【发布时间】:2014-05-23 16:28:11
【问题描述】:

我正在尝试将字符串“5/23/14 02:23:24”从 Eclipse 中的字符串转换为日期以插入 SQL 语句。我的代码如下:

String dateAndTime = "5/23/14 02:23:24";
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yy HH:mm:ss");
Date date = sdf.parse(dateAndTime);
long dateLong = date.getTime();
insertStatement.setDate(1, new java.sql.Date(dateLong));

我希望看到

23-MAY-2014 2.23.24.000000000 PM

在我的桌子上,但我看到了

23-MAY-2014 12.00.00.000000000 AM

谁能解释我做错了什么?

谢谢!

【问题讨论】:

标签: java sql datetime jdbc time


【解决方案1】:

标准的DATE SQL 类型没有与之关联的任何时间信息,因此the javadocs for java.sql.Date 状态:

为了符合 SQL DATE 的定义,由 java.sql.Date 实例包装的毫秒值必须通过在特定时区中将小时、分钟、秒和毫秒设置为零来进行“规范化”。实例已关联。

您需要改用java.sql.Timestamp。它对应于 SQL 类型TIMESTAMP,它保存日期和时间数据。

【讨论】:

    【解决方案2】:

    您正在呼叫setDate,它使用java.sql.Date。这表示只是一个日期,而不是日期和时间。

    您应该考虑改用setTimestampjava.sql.Timestamp。 (对于您的特定数据库,可能还有其他方法可以做到这一点,但这可能是最简单的通用解决方案):

    long dateLong = date.getTime();
    insertStatement.setTimestamp(1, new java.sql.Timestamp(dateLong));
    

    【讨论】:

      【解决方案3】:

      java.time

      旧的日期时间 API(java.util 日期时间类型及其格式化 API,SimpleDateFormat)已过时且容易出错。建议完全停止使用,改用java.timemodern date-time API*

      使用现代日期时间 API 的解决方案:

      1. 将日期时间字符串解析为LocalDateTime
      String dateAndTime = "5/23/14 02:23:24";
      DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/uu H:m:s", Locale.ENGLISH);
      LocalDateTime ldt = LocalDateTime.parse(dateAndTime, dtf);
      
      1. 使用PreparedStatement#setObjectLocalDateTime的实例设置到数据库中:
      Statement st = conn.createStatement();
      PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
      st.setObject(1, ldt);
      st.executeUpdate();
      st.close();
      
      1. 要从数据库中读取它,请使用Resultset#getObject
      Statement st = conn.createStatement();
      ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE ...");
      while (rs.next()) {
         LocalDateTime ldt = rs.getObject(1, LocalDateTime.class));
         System.out.println(ldt);
      }
      rs.close();
      st.close();
      

      Trail: Date Time 了解有关 modern date-time API* 的更多信息。


      * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

      【讨论】:

        猜你喜欢
        • 2012-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-20
        • 2016-04-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多