2 回答
TA贡献1793条经验 获得超6个赞
说你的两个日期有不同的格式是不准确的。ADate没有格式。您所看到的打印日期是它们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。但是,子类(继承)关系是一种 hack,您不应在代码中依赖它。
不过,继承 hack 只是这两个类的众多设计问题之一。幸运的是,两者都有更新更现代的替代品。对于java.util.Datemodern Instantclass是最直接对应的类型,但具体使用哪一种取决于你更精确的要求。为了java.sql.Date更简单,使用LocalDate. Instant和都是LocalDate现代 Java 日期和时间 API java.time 的一部分。
所以看看你是否可以用java.time 中bean.fooDate的一个或其他合适的现代类型替换。Instant同样看看你是否可以fooEntity.getFooDate()返回一个LocalDate. Hibernate 应该很乐意为您处理LocalDate而不是Date为您处理(除非您的 Hibernate 版本很旧)。
无论如何,Srinivasan Sekar 是正确的,您应该将您从每个获得的任何类型转换LocalDate为只比较日期而不是小时、分钟和秒。LocalDate正是这样:一个没有时间的日期。
假设您Instant从bean.fooDate. 那么转换是:
LocalDate localDate1 = bean.fooDate.atZone(ZoneId.of("Africa/El_Aaiun")).toLocalDate();
请务必指定适当的时区。
如果您无法避免使用老式的Date,则 Srinivasan Sekar 的回答中的转换是正确的:
LocalDate localDate1 = bean.fooDate
.toInstant()
.atZone(ZoneId.of("Africa/El_Aaiun"))
.toLocalDate();
对于 的情况fooEntity.getFooDate(),如果你能得到LocalDate前面提到的 a,你就完成了。如果只能得到 a Date,首先检查该方法是否被声明为返回 ajava.util.Date或 a java.sql.Date。这可能取决于声明方法的文件中使用的导入。a 的情况java.sql.Date很简单(但不幸的是不能保证总是给出正确的日期):
LocalDate localDate2 = fooEntity.getFooDate().toLocalDate();
如果声明的返回类型是java.util.Date,您可以在上面添加一个强制转换,因为看起来实际返回的对象是一个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以防您需要确定哪个更早。
链接: Oracle 教程:解释如何使用 java.time 的日期时间。
TA贡献2003条经验 获得超2个赞
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
}
您还可以使用此技术来查看一个是在另一个之前还是之后使用<or >。
编辑:如果您想比较日期而不考虑时间部分,只需将返回的每个值除以getTime()一天中的毫秒数(1000 * 60 * 60 * 24):
long millisInADay = 1000 * 60 * 60 * 24;
long m1 = d1.getTime() / millisInADay;
long m2 = d2.getTime() / millisInADay;
if (m1 == m2) {
// the two dates (excluding time) are the same
} else {
// they're not
}
添加回答
举报