Joda DateTime equals与isEqual的区别

11

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

注意: 如您所见,在打印输出中,两个实例具有相同的毫秒数和相同的时区。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Sachin Verma
你能提供可重现的代码来创建那些DateTime对象吗? - Yosef Weiner
日志消息应该说“Comparing” +abrDateTime+“和”+ breakStart,这是打字错误。 - Petr Janeček
好的,我明白了并已经更改了。抱歉并感谢。 - Sachin Verma
2个回答

13
首先,您可能需要检查您的代码,因为您给出的片段打印了相同的对象(即abrDateTime ),但是在equalsisEqual方法中,您将abrDateTimebreakStart 对象进行比较。
其次,在这种情况下,最好的方法是检查API文档。对于equals,文档说明:
“根据毫秒瞬间、年表和时区将此对象与指定对象进行比较以确定它们是否相等”
而对于isEqual,文档说明:
“仅通过毫秒比较传递的瞬间是否等于此瞬间”
因此,选择是,您想仅基于时间检查时间吗?然后使用isEqual 方法。或者,如果您还想检查时区和日历,则使用equals
编辑:
回应您的评论,
1. 日历系统及其比较的原因 => 从文档中获取
“年表提供对纪元历日时间字段的访问。”
因此,您可以认为Chronology 是一个包含特定日历系统(如ISO、Gregorian、Buddhist等)的日期和时间字段的类。

这是必需的,因为你不想比较两个使用不同日历系统表示的日期。例如,假设在伊斯兰教日历系统中,公历6月1日将是14 SHa`baan(这只是我的看法,因此可能与API作者的原意不同,因为原因未经记录)。

  • 如果您只想比较毫秒和时区,则可以使用isEqual方法。


  • 谢谢@kucing,只是我不明白chronology是什么意思,为什么需要进行比较。比较毫秒和时区应该已经完成了工作。 - Sachin Verma
    @sachin。可以将其视为日历系统,例如儒略日、ISO等。您可以在此处查看:http://joda-time.sourceforge.net/key_chronology.html - kucing_terbang

    3
    ReadableInstant类(DateTime的超类)的equals方法还包括Chronology,而isEqual严格查看时间点(自纪元以来的毫秒数)。在您的情况下,这两个对象具有不同的Chronology

    根据Javadocs,该方法比较此对象与指定对象的相等性,基于毫秒级时间和Chronology。所有ReadableInstant实例都被接受。要比较两个瞬间的绝对时间(即忽略年表的UTC毫秒数),请使用isEqual(ReadableInstant)Comparable.compareTo(Object)


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接