Java 比较不同格式的两个日期

Java 比较不同格式的两个日期,java,spring,hibernate,spring-mvc,jpa,Java,Spring,Hibernate,Spring Mvc,Jpa,如何从不同格式比较这两个日期,以检查它们是否相等 Date d1 = bean.fooDate; // >> from a post request System.out.println(d1); // >> "Sat May 25 10:00:00 WET 2019" Date d2 = fooEntity.getFooDate(); // >> from mysql database System.out.println(d2); // >>

如何从不同格式比较这两个日期,以检查它们是否相等

Date d1 = bean.fooDate; // >> from a post request
System.out.println(d1); // >> "Sat May 25 10:00:00 WET 2019"

Date d2 = fooEntity.getFooDate(); // >> from mysql database
System.out.println(d2); // >> "2019-05-25"

p.S我只想将其作为日期而不是日期时间进行比较(无需比较分钟和秒)

date
对象有一个方法
getTime()
返回自1970年1月1日以来的毫秒数()

因此,要比较这两个日期:

if (d1.getTime() == d2.getTime()) {
    // the dates represent the same point in time
} else {
    // they are different points in time
}
您还可以使用此技术,使用
查看一个是在另一个之前还是之后

编辑:如果要比较日期而不考虑时间成分,只需将从
getTime()
返回的每个值除以一天中的毫秒数(1000*60*60*24):

使用java 8 time中的
toLocalDate()
单独比较日期部分

LocalDate localDate1=date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate localDate2=date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
localDate1.compareTo(localDate2)

说你的两次约会形式不同并不准确。
日期
没有格式。您所看到的打印日期的内容是它们的
toString
方法的返回值

相反,您的日期具有不同的运行时类型
d1
java.util.Date
的一个实例,它的
toString
方法生成了格式
Sat May 25 10:00:00 WET 2019
d2
又是
java.sql.Date
的一个实例。它是
java.util.Date
的子类,因此可以分配给这种类型的变量
java.sql.Date.toString()
生成格式
2019-05-25
。然而,子类(继承)关系是一种在代码中不应该依赖的黑客行为

不过,继承黑客只是这两个类的许多设计问题中的一个。幸运的是,两者都有更新更现代的替代品。对于
java.util.Date
而言,现代
Instant
类是最直接的对应类型,但具体使用哪种类型取决于您更精确的需求。要使
java.sql.Date
更简单,请使用
LocalDate
Instant
LocalDate
都是现代java日期和时间API java.time的一部分

因此,看看是否可以用java.time中的
即时
或其他合适的现代类型替换
bean.fooDate
。类似地,查看是否可以获取
footentity.getFooDate()
以返回
LocalDate
。Hibernate应该乐意为您处理
LocalDate
而不是
Date
(除非您的Hibernate版本非常旧)

在任何情况下,Srinivasan Sekar都是正确的,您应该将从每种类型中获得的任何类型转换为
LocalDate
,以便仅比较日期,而不是小时、分钟和秒
LocalDate
就是这样的:一个没有时间的日期

假设您从
bean.fooDate
获得一个
Instant
。那么转换为:

    LocalDate localDate1 = bean.fooDate.atZone(ZoneId.of("Africa/El_Aaiun")).toLocalDate();
请务必指定一个适当的时区

如果您无法避免旧式的
日期
,Srinivasan Sekar回答中的转换是正确的:

    LocalDate localDate1 = bean.fooDate
            .toInstant()
            .atZone(ZoneId.of("Africa/El_Aaiun"))
            .toLocalDate();
对于
footentity.getFooDate()
的情况,如果您可以获得前面提到的
LocalDate
,那么就完成了。如果只能获取
日期
,请首先检查该方法是否声明为返回
java.util.Date
java.sql.Date
。这可能取决于声明方法的文件中使用的导入。
java.sql.Date
的情况非常简单(遗憾的是,不能保证总是给出正确的日期):

如果声明的返回类型是
java.util.Date
,您可以在上面添加一个cast,因为实际返回的对象似乎是
java.sql.Date
。不过,首先测试您的假设会更安全:

    LocalDate localDate2;
    Date d2 = fooEntity.getFooDate();
    if (d2 instanceof java.sql.Date) {
        localDate2 = ((java.sql.Date) fooEntity.getFooDate()).toLocalDate();
    } else {
        localDate2 = d2.toInstant()
                .atZone(ZoneId.of("Africa/El_Aaiun"))
                .toLocalDate();
    }
您将认识到,在第二种情况下,我使用的转换与上面相同

要比较生成的
LocalDate
变量:

    if (localDate1.isEqual(localDate2)) {
        System.out.println("Same date");
    } else {
        System.out.println("Different dates");
    }
LocalDate
也有方法
isBefore
isAfter
,以防您需要确定哪个在前面


链接:解释如何使用java.time。

getTime()
不起作用给了我两个不同的值
1558742400000
1558778400000
编辑以删除时间因素并只比较日期。只有当询问者的时区与UTC一致时,除以一天中的毫秒数才能正确工作,很少有时区能做到这一点。它也是非常手动的,因此不容易阅读。(首先阅读输出,然后再阅读代码可能是最简单的)。谢谢你对我答案的否决票。如果是你。这只是一种怀疑,我不知道。是我写了你的,我相信我已经解释了原因。我在java.sql.Date.toInstant(Date.java:304)上得到了这个错误
java.lang.UnsupportedOperationException
Date应该是util.Date bro。不知道你在使用sql.Date。你们俩的日期都是java.sql.Date吗@您可能不知道它们来自
java.util.Date
我不明白它是什么时候来自这个
java.sql.Date
可能是因为我使用的是hibernate???
LocalDate localDate1=date1 instanceof java.sql.Date?((java.sql.Date)date1.toLocalDate():date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate()。类似地,对于
date2
(实际上,可能只需要针对问题中的
d2
)。
    LocalDate localDate2;
    Date d2 = fooEntity.getFooDate();
    if (d2 instanceof java.sql.Date) {
        localDate2 = ((java.sql.Date) fooEntity.getFooDate()).toLocalDate();
    } else {
        localDate2 = d2.toInstant()
                .atZone(ZoneId.of("Africa/El_Aaiun"))
                .toLocalDate();
    }
    if (localDate1.isEqual(localDate2)) {
        System.out.println("Same date");
    } else {
        System.out.println("Different dates");
    }