JDBC java.sql.Date()比较是假的

Isr*_*elm 1 java sql sql-server date jdbc

我很好奇为什么if比较是假的:

我使用以下代码在日期字段中插入日期:

preparedStatement.setDate(1, new java.sql.Date(new java.util.Date().getTime()));
System.out.println("sql date" + new java.sql.Date(new java.util.Date().getTime()));
output is: 2014-07-16
Run Code Online (Sandbox Code Playgroud)

插入后,我查询数据库以查明今天是否插入了记录:

    String sql = select MAX (last_modified) as last_modified from mydb.mytable
    ResultSet rs = stmt.executeQuery(sql);

    while (rs.next())
    {

        if (rs.getDate(1).equals(new java.sql.Date(new java.util.Date().getTime())))
        {
            System.out.println("Same Date in here not need to update");
         }
        else
        {
            System.out.println("Dates are different");
        }

        System.out.println("date from db: " + rs.getDate(1));  
        System.out.println("new sql date: " + new java.sql.Date(new java.util.Date().getTime()));: 
    }
Run Code Online (Sandbox Code Playgroud)

输出是:

Dates are different
date from db: 2014-07-16
new sql date: 2014-07-16
Run Code Online (Sandbox Code Playgroud)

我认为两个日期都相似,都是为了匹配java.sql.Date,可能条件不正确.

我理解任何有助于理解这种行为的帮助.

Bas*_*que 5

你工作太辛苦了.在现代Java中进行这种比较有更简单,更清晰的方法.

旧的java.util.Date,java.sql.Date和.Calendar类是众所周知的麻烦,应该避免.

java.sql.Date 哈克

java.sql.Date只是一个java.util.Date,其时间设置为00:00:00(UTC).这是一个古老的蹩脚黑客,可以解决Java的早期版本缺少一个类来表示仅限日期而没有任何时间或时区的事实.

java.time

现在,Java 8确实有一个仅限日期的类LocalDate,可以在新的java.time包中找到.

方法已添加到java.sql.Date类中以转换为/从LocalDate转换.

LocalDate localDate = someSqlDate.toLocalDate();
LocalDate today = LocalDate.now( ZoneOffset.UTC ); // Pass a time zone to get current date in UTC for fair comparison.
boolean localDateIsToday = localDate.isEqual( today );
Run Code Online (Sandbox Code Playgroud)

走另一条路......

java.sql.Date sqlDate = java.sql.Date.valueOf( someLocalDate );
Run Code Online (Sandbox Code Playgroud)

JDBC 4.2驱动程序

如果您的JDBC驱动程序已更新为支持JDBC 4.2,那么根据JDBC 4.2规范更新(项目#21),您可以getObject在ResultSet上调用该方法以直接获取LocalDate对象.

同样,调用setObjectLocalDate对象传递给数据库中的SQL DATE类型列.

java.sql.Date完全避免.

乔达时间

java.time包的灵感来自Joda-Time库.您可以在Java的早期版本中使用它,其中java.time不可用.Joda-Time也提供LocalDate课程.