有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

迄今为止的sql字符串

我试图将Eclipse中的字符串“5/23/14 02:23:24”转换为要插入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

谁能解释一下我做错了什么

谢谢


共 (3) 个答案

  1. # 1 楼答案

    标准DATESQL类型没有任何与之关联的时间信息,因此the javadocs for ^{}状态:

    To conform with the definition of SQL DATE, the millisecond values wrapped by a java.sql.Date instance must be 'normalized' by setting the hours, minutes, seconds, and milliseconds to zero in the particular time zone with which the instance is associated.

    您将希望改用^{}。它对应于SQL类型TIMESTAMP,它保存日期和时间数据

  2. # 2 楼答案

    爪哇。时间

    旧式日期时间API(java.util日期时间类型及其格式API,SimpleDateFormat)已过时且容易出错。建议完全停止使用它,并切换到java.time,即modern 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. 使用^{}LocalDateTime的实例设置到数据库中:
    Statement st = conn.createStatement();
    PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
    st.setObject(1, ldt);
    st.executeUpdate();
    st.close();
    
    1. 要从数据库中读取,请使用^{}
    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的后台端口。Java 6&;的时间功能;7.如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请选中Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

  3. # 3 楼答案

    您正在调用setDate,它使用^{}。它只表示日期,而不是日期和时间

    您应该考虑使用^ {CD3>},使用^{}。(对于您的特定数据库,可能还有其他方法,但这可能是最简单的通用解决方案):

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