如何测试和比较两个 java.time.format.DateTimeFormatter-s?

How to test and compare two java.time.format.DateTimeFormatter-s?

如何比较两个java.time.format.DateTimeFormatters?

由于 DateTimeFormatters 没有重写的 'equals' 方法。

测试:

import java.time.format.DateTimeFormatter;

DateTimeFormatter.ofPattern("M/dd/yyyy").equals(DateTimeFormatter.ofPattern("M/dd/yyyy"))

结果:

false

这是'Object.equals()'方法的行为。 文档:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

Methods inherited from class java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

需要时的用例:

例如我的方法returns DateTimeFormatter。我想创建测试来验证返回的 DateFormatter 是否正确。

例如:

DateTimeFormatter expectedFormatter = DateTimeFormatter.ofPattern("my custom format")
DateTimeFormatter actualFormatter = someService.getFormatter()
Assert.assertEquals(actualFormatter, expectedFormatter)

可能是因为确定格式化程序的相等性是 non-trivial,因为有很多方法可以通过构建器构建“相同”的格式化程序(就行为而言),而且很少有用。

JDK 开发人员的时间有限。他们优先考虑进口的东西。 DateTimeFormatter 以一致且惯用的方式覆盖 equals 比看起来要难得多,他们最好把时间花在其他地方。

无论如何,知道它为什么不存在对你没有帮助。这就是你所处的情况,而且不会很快改变。

我的建议是测试行为。构造一些日期(或 date-time)并查看两个格式化程序是否产生相同的输出。

DateTimeFormatter expectedFormatter = DateTimeFormatter.ofPattern("my custom format")
DateTimeFormatter actualFormatter = someService.getFormatter();

LocalDate someFakeDate = LocalDate.of(2020, 1, 1);
Assert.assertEquals(actualFormatter.format(someFakeDate), expectedFormatter.format(someFakeDate));

个可以比较

由于 DateTimeFormatter 是无法扩展的 final class,您可以将所有实例替换为创建 class 实例的包装器 class =11=] 在构造函数中访问生成的 DateTimeFormatter 实例并在代码中传递自定义 DataTimeFormatterContainer classes。它是一头野兽,但它会按照你的要求去做。

当然,这个比较完全符合规律;如果两个 non-identical 模式在解析日期时生成相同的结果,这将 return false。

准系统提案;没有 null 检查、访问器方法或哈希码:

public class DateTimeFormatterContainer() {

    public final String pattern;
    public final DateTimeFormatter formatter;

    public DateTimeFormatterContainer(String pattern) {

        this.pattern = pattern;
        this.formatter = DateTimeFormatter.ofPattern(pattern);
    }

    public boolean equals(DateTimeFormatterContainer that) {

        return this.pattern.equals(that.pattern);
    }
}