gpt4 book ai didi

java - 如何规范化 ZonedDateTime 以便 .equals() 起作用?

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:01:55 27 4
gpt4 key购买 nike

我有类似这样的代码:

import java.time._

object app {
def main (args :Array[String]) = {
println("app started")

// create two ZonedDateTime objects for 1st Jan 2018, 10am UTC
// using separate methods
val zdt1 = ZonedDateTime.of(2018, 1, 1, 10, 0, 0, 0, ZoneId.of("UTC"))
val zdt2 = ZonedDateTime.parse("2018-01-01T10:00:00Z")

println(s"COMPARING: $zdt1 and $zdt2")
println("== check: " + (zdt1 == zdt2))
println(".equals check: " + (zdt1.equals(zdt2)))
println(".isEqual check " + (zdt1.isEqual(zdt2)))

println("app finished")
}
}

此处提供代码:https://ideone.com/43zf8B

问题:

  1. 这些都是类型化的 ZonedDateTime 对象
  2. 根据 .isEqual() 方法,它们是等价的..
  3. 根据 .equals() 方法,它们不等价

但是我的测试套件使用 beEquals 进行深度匹配针对这些日期时间实例的类的操作在,因此我需要一种方法来标准化它们,以便.equals() 返回真。

请问我怎样才能使它们正常化?

最佳答案

如果我用 ZonedDateTime.of(2018, 1, 1, 10, 0, 0, 0, ZoneOffset.UTC) 创建 zdt1,这两个对象是相等的在 equals() 下(仍然不在 Java 中的 == 下)。

显然,当区域名称不同时,仅仅等同是不够的。通过使用 ZoneOffset.UTC 构建第一个 ZonedDateTime,两者将具有相同的时区,因此将是相等的。通过我的更改,至少在我的 Mac 上,zdt1.getZone() == zdt2.getZone() 现在计算为 true

作为对您问题的更直接的回答,您可以通过这种方式规范化您的 ZonedDateTime 对象(Java 语法中有分号,请自行翻译):

    zdt1 = zdt1.withZoneSameInstant(zdt1.getZone().normalized());

当然,zdt2 也类似。 ZoneId.normalized() promise 在可能的情况下返回一个 ZoneOffset,这就是您的情况。因此,在您的情况下,它确实使两个对象在 equals() 下相等。我不确定在所有其他情况下都会如此。

更安全的方法是让比较明确地处理不同但相同的时区:

zdt1.toInstant().equals(zdt2.toInstant())
&& zdt1.getZone().getRules().equals(zdt2.getZone().getRules())

这对问题中的两个日期时间的计算结果为 true

顺便说一句 isEqual()仅比较时间瞬间,根本不比较区域,这就是它不关心的原因。

关于java - 如何规范化 ZonedDateTime 以便 .equals() 起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48379995/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com