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");
}