如何比较这两种不同格式的日期,以检查它们是否相等
{{1}}
P.S我只想将其作为日期而不是日期时间进行比较(无需比较分钟和秒)
答案 0 :(得分:1)
Date
对象具有方法getTime()
,该方法返回自1970年1月1日以来的毫秒数(see the docs)。
因此,要比较两个日期:
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):
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
}
答案 1 :(得分:1)
使用Java 8时间中的toLocalDate()
单独比较日期部分
LocalDate localDate1=date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate localDate2=date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
localDate1.compareTo(localDate2)
答案 2 :(得分:1)
说您的两个日期格式不同确实不是很准确。 Date
没有格式。您看到的打印日期是它们的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只是这两个类的众多设计问题之一。幸运的是,两者都有更新和更现代的替代品。对于java.util.Date
,现代的Instant
类是最直接对应的类型,但是究竟要使用哪种类型则取决于您的更精确要求。对于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
,就可以了。如果只能得到Date
,请首先检查该方法是否声明为返回java.util.Date
或java.sql.Date
。它可能取决于声明该方法的文件中使用的导入。 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 tutorial: Date Time解释了如何使用java.time。