我很好奇为什么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
插入后,我查询数据库以查明今天是否插入了记录:
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()));:
}
输出结果为:
Dates are different
date from db: 2014-07-16
new sql date: 2014-07-16
我认为两个日期都相似,并且两者都是为了匹配java.sql.Date,可能条件不正确。
我感谢您理解此行为的任何帮助。
答案 0 :(得分:5)
你工作太辛苦了。在现代Java中进行这种比较有更简单,更清晰的方法。
旧的java.util.Date,java.sql.Date和.Calendar类非常麻烦,应该避免使用。
java.sql.Date
是一个Hack java.sql.Date只是一个java.util.Date,其时间设置为00:00:00(UTC)。这是一个古老的蹩脚黑客,可以解决Java的早期版本缺少一个类来表示仅限日期而没有任何时间或时区的事实。
现在,Java 8确实有一个仅限日期的类LocalDate
,可在新的java.time package中找到。
已将方法添加到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 );
走另一条路......
java.sql.Date sqlDate = java.sql.Date.valueOf( someLocalDate );
如果您的JDBC驱动程序已更新为支持JDBC 4.2,那么根据JDBC 4.2 Spec Update(第21项),您可以在ResultSet上调用getObject
方法直接获取{{1}对象。
同样,调用LocalDate
将setObject
对象传递到数据库中的SQL DATE type列。
完全避免LocalDate
。
java.time包的灵感来自Joda-Time库。您可以在Java的早期版本中使用它,其中java.time不可用。 Joda-Time也提供LocalDate
课程。
答案 1 :(得分:3)
您正在比较Date
和long
if (rs.getDate(1).equals(new java.sql.Date(new java.util.Date().getTime())))
将其更改为
if (rs.getDate(1).getTime() == System.currentTimeInMillis())
从你的提交中你想要日级精度
Calendar startOfToday = Calendar.getInstance();
Calendar endOfToday = Calendar.getInstance();
endOfToday.setTime(startOfToday.getTime());
startOfToday.set(Calendar.HOUR_OF_DAY, 0);
startOfToday.set(Calendar.MINUTE, 0);
startOfToday.set(Calendar.SECOND, 0);
startOfToday.set(Calendar.MILLISECOND, 0);
endOfToday.set(Calendar.HOUR_OF_DAY, 23);
endOfToday.set(Calendar.MINUTE, 59);
endOfToday.set(Calendar.SECOND, 59);
endOfToday.set(Calendar.MILLISECOND, 999);
long transactionDate = rc.getDate(1).getTime();
if(transactionDate >= startOfToday.getTimeInMillis() && transactionDate <= endOfToday.getTimeInMillis()){
}
答案 2 :(得分:1)
将测试更改为:
if (rs.getDate(1).toString().equals(new java.sql.Date(System.currentMillis()).toString())