gpt4 book ai didi

java - 比较不同格式的两个日期

转载 作者:行者123 更新时间:2023-11-29 04:09:09 24 4
gpt4 key购买 nike

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

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 没有格式。您所看到的打印日期是它们的 toString 方法的返回值。

相反,您的日期具有不同的运行时类型d1java.util.Date 的一个实例,它的 toString 方法生成格式 Sat May 25 10:00:00 WET 2019d2又是java.sql.Date的实例。它是 java.util.Date 的子类,因此可以分配给该类型的变量。 java.sql.Date.toString() 生成格式 2019-05-25。但是,子类(继承)关系是一种 hack,您不应在代码中依赖它。

不过,继承 hack 只是这两个类的众多设计问题之一。幸运的是,两者都有更新更现代的替代品。对于 java.util.Date,现代的 Instant 类是最直接对应的类型,但具体使用哪一个取决于您更精确的要求。 java.sql.Date 更简单,使用LocalDateInstantLocalDate 都是现代 Java 日期和时间 API java.time 的一部分。

因此,看看您是否可以将 bean.fooDate 替换为 Instant 或来自 java.time 的其他合适的现代类型。类似地,看看您是否可以让 fooEntity.getFooDate() 返回一个 LocalDate。 Hibernate 应该很乐意为您处理 LocalDate 而不是 Date(除非您的 Hibernate 版本很旧)。

在任何情况下,Srinivasan Sekar 是正确的,您应该将您从每个获得的任何类型转换为 LocalDate 以仅比较日期而不是小时、分钟和秒。 LocalDate 就是:没有时间的日期。

假设您从 bean.fooDate 获得了一个 Instant。那么转换就是:

    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 还有方法 isBeforeisAfter 以防您需要确定哪个更早。

链接: Oracle tutorial: Date Time解释如何使用 java.time。

关于java - 比较不同格式的两个日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56161066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com