问题描述
如何比较两个java.time.format.DateTimeFormatters?
由于DateTimeFormatters没有重写的“等于”方法。
测试:
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
从类java.lang.Object继承的方法 克隆,等于,完成,getClass,hashCode,通知,notifyAll,等待,等待,等待
需要时的用例:
例如,我的方法返回DateTimeFormatter。我想创建测试以验证返回的DateFormatter是否正确。
例如:
DateTimeFormatter expectedFormatter = DateTimeFormatter.ofPattern("my custom format")
DateTimeFormatter actualFormatter = someService.getFormatter()
Assert.assertEquals(actualFormatter,expectedFormatter)
解决方法
可能是因为确定格式化程序的相等性并非易事,因为有许多方法可以通过构建器构造“相同”格式化程序(就行为而言),并且很少有用。
JDK开发人员有有限的时间。他们优先考虑进口物品。以一致且惯用的方式覆盖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比看起来要困难得多,因为最好在其他地方花费时间。
无论如何,它不能帮助您知道为什么不存在。这就是您所处的情况,并且不会很快改变。
我的建议是测试行为。构造一些日期(或日期时间),看看两个格式化程序是否产生相同的输出。
{{1}},
有ways to obtain the original pattern供比较。
由于DateTimeFormatter
是无法扩展的final
类,因此可以用包装器类替换所有实例,该包装器类在构造函数中创建DateTimeFormatter
的实例并访问生成的DateTimeFormatter
实例,并在代码中传递自定义的DataTimeFormatterContainer
类。这是野兽,但会满足您的要求。
当然,这正好比较了模式;如果两个不同的模式在解析日期时产生相同的结果,则将返回false。
有关骨骼的建议;没有空检查,访问器方法或哈希码:
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);
}
}