我有两个类似的日期,我对Joda DateTime api提供的比较表示怀疑:
log.info("comparing:"+abrDateTime+": and :"+breakStart+":"+abrDateTime.equals(breakStart));
打印
comparing:2015-07-14T12:25:47.000+05:30: and :2015-07-14T12:25:47.000+05:30:false
While with DateTime.isEqual
log.info("comparing:"+abrDateTime+": and :"+breakStart+":"+abrDateTime.isEqual(breakStart));
打印:
comparing:2015-07-14T12:25:47.000+05:30: and :2015-07-14T12:25:47.000+05:30:true
问题是我正在使用DateTime。在我的应用程序中到处都是equals方法,我应该把它改成isEqual
吗?
注意:两个实例得到相同的millis和相同的时区,您可以在打印中看到。
首先,您可能需要检查您的代码,因为您给出的代码片段是打印相同的对象(即abrDateTime
),然而,在equals
和isEqual
方法中,您将abrDateTime
与breakStart
对象进行比较。
第二,在这种情况下,最好的方法是检查API文档。对于等号,文档声明:
根据毫秒瞬间、时间顺序和时区将此对象与指定对象进行比较,以确定是否相等
和isEqual,文档声明:
这个瞬间是否等于仅以毫秒为单位进行比较的瞬间?
因此,选择是,您是否希望仅根据其时间检查时间?然后用isEqual
方法。或者,如果您还想检查时区和时间顺序,则使用equals
编辑:
解决你的评论,
年表和为什么需要比较=>摘自doc
Chronology为按时间顺序的日历系统提供了对单个日期时间字段的访问。
因此,您可以将
Chronology
视为包含特定日历系统的日期和时间字段的类。(如ISO、公历、佛历等)这是必需的,因为你不想比较两个日期,但在不同的日历系统。例如,在伊斯兰历法系统中,格里高利历的6月1日是夏班14日(这是我的观点,因此可能与API作者的意图不同,因为没有记录原因)
如果您只想比较工厂和时区。那么我想你可以使用
isEqual
方法。
ReadableInstant
(DateTime
的超类)的equals
方法也合并了Chronology
,而isEqual
严格地查看时间上的瞬间(自epoch以来的毫秒)。在您的示例中,两个对象具有不同的Chronology
s。
来自Javadocs:
根据毫秒瞬间和Chronology将此对象与指定对象进行比较是否相等。所有的ReadableInstant实例都被接受。
比较两个瞬间的绝对时间(如:使用isEqual(ReadableInstant)或Comparable.compareTo(Object)。