Joda DateTime等于vs isEqual

时间:2015-07-14 07:16:16

标签: java datetime jodatime

我有两个相似的日期,我对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吗?

注意:两个实例都具有相同的毫秒和相同的时区,就像您在打印中看到的一样。

2 个答案:

答案 0 :(得分:10)

首先,您可能需要检查您的代码,因为您提供的代码段是打印同一个对象(abrDateTime),但在equalsisEqual方法中,您将abrDateTimebreakStart对象进行比较。

其次,在这样的时候,最好的方法是检查API文档。 对于equals,doc说明:

  

根据毫秒即时,时间和时区将此对象与指定对象进行相等性比较

isEqual,doc说明:

  

此瞬间是否等于仅通过毫秒

比较的瞬间

所以,选择的是,你想根据时间检查时间吗?然后使用isEqual方法。或者,如果您还想查看时区和年表,请使用equals

修改

发表评论,

  1. 年代表以及为什么需要进行比较 =>取自doc

      

    按时间顺序,可以访问按时间顺序排列的日历系统的各个日期时间字段。

    因此,您可以将Chronology视为包含特定日历系统的日期和时间字段的类。 (如ISO,格里高利,佛教等)

    这是必要的,因为您不想比较两个日期,而是在不同的日历系统中。例如,在伊斯兰日历系统中,6月1日格里高利将是14 SHa`baan(这是我的意见所以它可能与API作者的意图不同,原因没有记录)

    < / LI>
  2. 如果您只想比较工厂和时区。然后我想你可以使用isEqual方法。

答案 1 :(得分:2)

equals的{​​{1}}方法(ReadableInstant的超类)也包含DateTime,而Chronology严格查看当前时间(毫秒)时代)。在您的情况下,两个对象具有不同的isEqual s。

来自Javadocs

  

根据毫秒时刻和年表,将此对象与指定对象进行相等性比较。接受所有ReadableInstant实例。

     

要比较绝对时间的两个时刻(即忽略年表的UTC毫秒),请使用isEqual(ReadableInstant)或Comparable.compareTo(Object)。