猿问

比较不同格式的两个日期

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


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"

PS 我只想将它作为日期而不是日期时间进行比较(不需要比较分钟和秒)


慕无忌1623718
浏览 102回答 2
2回答

摇曳的蔷薇

说你的两个日期有不同的格式是不准确的。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 的日期时间。

湖上湖

Date对象有一个getTime()返回自 1970 年 1 月 1 日以来的毫秒数的方法(请参阅文档)。因此,要比较两个日期:if (d1.getTime() == d2.getTime()) {&nbsp; &nbsp; // the dates represent the same point in time} else {&nbsp; &nbsp; // 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) {&nbsp; &nbsp; // the two dates (excluding time) are the same} else {&nbsp; &nbsp; // they're not}
随时随地看视频慕课网APP

相关分类

Java
我要回答