Java中相同的日期返回-1

问题描述 投票:0回答:3
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

  1. 当日期相同时我得到-1例如10/04/202010/04/2020

在第二种情况下,我应该得到0,为什么结果是-1?

java jdbc
3个回答
1
投票

tl; dr

使用现代的[[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的列,请使用setObjectupdateObjectgetObject交换LocalDate对象。

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ; 要获取今天的日期,需要一个时区。在任何给定时刻,日期都会随时区在全球范围内变化。因此,虽然在日本东京可能是“明天”,但在美国俄亥俄州托莱多却可能同时是“昨天”。

如果未指定时区,则将隐式应用JVM的当前默认时区。 

ZoneId z = ZoneId.of( "Asia/Tokyo" ) ; LocalDate today = LocalDate.now( z ) ;

使用isEqualisBeforeisAfter方法进行比较。

Boolean isFuture = ld.isAfter( today ) ;

2
投票

如果此Date在Date参数之前,则小于0的值

today()(=最后一个午夜)或表中的任何日期都可能小于now()(包括当前时间)

1
投票
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中所示-使用专门的比较方法,例如isAfterisAfterisBefore

© www.soinside.com 2019 - 2024. All rights reserved.