比较不同格式的两个日期

时间:2019-05-16 04:54:35

标签: java spring hibernate spring-mvc jpa

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

{{1}}

P.S我只想将其作为日期而不是日期时间进行比较(无需比较分钟和秒)

3 个答案:

答案 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方法的返回值。

相反,您的日期具有不同的运行时类型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只是这两个类的众多设计问题之一。幸运的是,两者都有更新和更现代的替代品。对于java.util.Date,现代的Instant类是最直接对应的类型,但是究竟要使用哪种类型则取决于您的更精确要求。对于java.sql.Date更简单,请使用LocalDateInstantLocalDate都是现代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.Datejava.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。