1

我有两个DateTime实例,A并且B,其中:

DateTime A = new DateTime(2018, 11, 4, 1, 00, 0).plusHours(1);
DateTime B = new DateTime(2018, 11, 4, 2, 00, 0);

println("A: "+ A +", "+ A.getChronology() +", ms "+ A.getMillis());
println("B: "+ B +", "+ B.getChronology() +", ms "+ B.getMillis());
println("A == B is "+ A.equals(B));

产生:

A: 2018-11-04T01:00:00.000-05:00, ISOChronology[America/New_York], ms 1541311200000
B: 2018-11-04T02:00:00.000-05:00, ISOChronology[America/New_York], ms 1541314800000
A == B is false

我如何比较AB查看它们是否是同一个实例?

仔细看看如何实例化AB实例化。关键是两者A实际上都B指的是同一时间点,即时钟从美国东部时间调回纽约东部时间的时间。

4

2 回答 2

1

根据javadoc,您可以使用:

  • equals:基于毫秒瞬间、年表和时区的平等
  • isEqual:这个瞬间是否等于传入的瞬间,仅以毫秒为单位进行比较

但是使用您示例中的日期,这两种方法都返回false. 这是有道理的,主要是因为返回的值getMillis()不同,所以日期实际上并不对应于相同的 UTC 时刻,正如另一个答案所解释的那样。

于 2018-03-21T19:26:12.687 回答
1

为了比较,您正确使用了equals. 但它正在回归false,因为它们不是同一时间点。如果您查看它们的值,您会发现A实际上是一小时前B

A: 2018-11-04T 01 :00:00.000-05:00, ISOChronology[America/New_York], ms 1541311200000
B: 2018-11-04T 02 :00:00.000-05:00, ISOChronology[America/New_York],女士1541314800000

结果getMillis()也不同,这意味着这些日期不是同一时间点。

这是因为new DateTime(2018, 11, 4, 1, 00, 0)生成的日期/时间仍在 EDT 中(“2018-11-04T 01 :00:00.000 -04:00 ” -> 1 AM in -04:00 偏移量)。

一小时后 ( plusHours(1)),您应该在偏移量 -04:00 处获得凌晨 2 点,但那是DST 在纽约结束的时刻:时钟设置为 1 小时回到凌晨 1 点,并且偏移量变为 -05:00 - 那是为什么A凌晨 1 点是 -05:00。

B另一方面,已经在 EST 中(不再在 DST 中),因此它在 -05:00 设置为凌晨 2 点。一小时后A


当 DST 结束时,我们会遇到这种奇怪的情况,本地时间存在两次(在这种情况下,1AM 和 1:59AM 之间的时间出现了两次:在 -04:00 偏移量,然后在 -05:00 偏移量),而 Joda -Time 默认选择 DST 转换前的偏移量 (-04:00)。

但是,您可以使用 覆盖它withLaterOffsetAtOverlap(),这将在DST 结束后获取偏移量。

// new DateTime creates 2018-11-04T01:00:00.000-04:00
DateTime A = new DateTime(2018, 11, 4, 1, 00, 0)
    // adjust to offset after DST ends (2018-11-04T01:00:00.000-05:00)
    .withLaterOffsetAtOverlap()
    // add 1 hour
    .plusHours(1);
DateTime B = new DateTime(2018, 11, 4, 2, 00, 0);

// now A and B are the same instant
System.out.println(A.equals(B)); // true
于 2018-03-21T17:09:29.957 回答