为了账号安全,请及时绑定邮箱和手机立即绑定

比较不同格式的两个日期

比较不同格式的两个日期

慕无忌1623718 2022-11-30 13:33:27
如何比较这两个不同格式的日期以检查它们是否相等Date d1 = bean.fooDate; // >> from a post requestSystem.out.println(d1); // >> "Sat May 25 10:00:00 WET 2019"Date d2 = fooEntity.getFooDate(); // >> from mysql databaseSystem.out.println(d2); // >> "2019-05-25"PS 我只想将它作为日期而不是日期时间进行比较(不需要比较分钟和秒)
查看完整描述

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 的日期时间。



查看完整回答
反对 回复 2022-11-30
?
湖上湖

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

}


查看完整回答
反对 回复 2022-11-30
  • 2 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信