我有两个相似的日期,我对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
使用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
吗?
注意:两个实例都具有相同的毫秒和相同的时区,就像您在打印中看到的一样。
答案 0 :(得分:10)
首先,您可能需要检查您的代码,因为您提供的代码段是打印同一个对象(abrDateTime
),但在equals
和isEqual
方法中,您将abrDateTime
与breakStart
对象进行比较。
其次,在这样的时候,最好的方法是检查API文档。 对于equals,doc说明:
根据毫秒即时,时间和时区将此对象与指定对象进行相等性比较
和isEqual,doc说明:
此瞬间是否等于仅通过毫秒
比较的瞬间
所以,选择的是,你想根据时间检查时间吗?然后使用isEqual
方法。或者,如果您还想查看时区和年表,请使用equals
修改强>
发表评论,
年代表以及为什么需要进行比较 =>取自doc
按时间顺序,可以访问按时间顺序排列的日历系统的各个日期时间字段。
因此,您可以将Chronology
视为包含特定日历系统的日期和时间字段的类。 (如ISO,格里高利,佛教等)
这是必要的,因为您不想比较两个日期,而是在不同的日历系统中。例如,在伊斯兰日历系统中,6月1日格里高利将是14 SHa`baan(这是我的意见所以它可能与API作者的意图不同,原因没有记录)
< / LI>如果您只想比较工厂和时区。然后我想你可以使用isEqual
方法。
答案 1 :(得分:2)
equals
的{{1}}方法(ReadableInstant
的超类)也包含DateTime
,而Chronology
严格查看当前时间(毫秒)时代)。在您的情况下,两个对象具有不同的isEqual
s。
来自Javadocs:
根据毫秒时刻和年表,将此对象与指定对象进行相等性比较。接受所有ReadableInstant实例。
要比较绝对时间的两个时刻(即忽略年表的UTC毫秒),请使用isEqual(ReadableInstant)或Comparable.compareTo(Object)。