try {
String hql = "SELECT taskDate FROM TaskFutureDates t WHERE t.taskId= : taskId";
List<java.sql.Date> result = em.createQuery(hql).setParameter("taskId", taskId).getResultList();
java.sql.Date currentDate =new Date(new java.util.Date().getTime());
if (result.size() != 0) {
for(java.sql.Date date: result) {
if(date.compareTo(currentDate)>=0) {
System.err.println("CAST= "+(Date) date);
return (java.sql.Date) date;
}
}
}
} catch (Exception e) {
// TODO: handle exception
//System.err.println(e);
}
return null;
}
当我比较两个日期时出现错误情况
1。当我比较其他天数时,我得到-1例如2020/09/0410/04/2020
在第二种情况下,我应该得到0,为什么结果是-1?
使用现代的[[java.time类来检索存储的日期值并将其与今天的日期进行比较。
myResultSet.getObject( … , LocalDate.class ).isAfter( LocalDate.now( "Africa/Tunis" ) )
详细信息类所取代。具体来说,如correct Answer by Rotteveel所述,您不应使用可怕的类
java.sql.Date
。几年前,该类被现代的[[java.time
java.time.LocalDate
。从JDBC 4.2开始,我们可以与数据库交换java.time对象。对于类似于标准SQL类型DATE
的列,请使用setObject
,updateObject
和getObject
交换LocalDate
对象。
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
要获取今天的日期,需要一个时区。在任何给定时刻,日期都会随时区在全球范围内变化。因此,虽然在日本东京可能是“明天”,但在美国俄亥俄州托莱多却可能同时是“昨天”。
如果未指定时区,则将隐式应用JVM的当前默认时区。
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ; LocalDate today = LocalDate.now( z ) ;
使用isEqual
,isBefore
和isAfter
方法进行比较。
Boolean isFuture = ld.isAfter( today ) ;
如果此Date在Date参数之前,则小于0的值
today()(=最后一个午夜)或表中的任何日期都可能小于now()(包括当前时间)
java.sql.Date
构造函数(Date(long)
)的实现是:public Date(long date) {
// If the millisecond date value contains time info, mask it out.
super(date);
}
与评论相反,没有任何东西被掩盖。这可能是因为java.sql.Date
对默认的JVM时区很敏感,而试图将其屏蔽掉只会使事情复杂化。
无论如何,从Java 8 / JDBC 4.2开始,最好使用java.time.LocalDate
而不是java.sql.Date
。如果无法完全切换为使用
LocalDate
,我建议至少使用:
LocalDate currentDate = LocalDate.now(); //... if (date.toLocalDate().compareTo(currentDate) >= 0) { // ... }
或-如answer by Basil Bourque中所示-使用专门的比较方法,例如isAfter
,isAfter
和isBefore
。