比较EST EDT中的两个joda DateTime实例

时间:2018-03-21 16:07:16

标签: java datetime jodatime dst datetime-comparison

我有两个DateTime个实例,AB,其中:

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的实例化方式。关键是AB实际上指的是同一时刻,即纽约市从EDT到EST的时钟。

2 个答案:

答案 0 :(得分: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],ms 1541314800000

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

那是因为new DateTime(2018, 11, 4, 1, 00, 0)产生的日期/时间仍在EDT中(&#34; 2018-11-04T 01 :00:00.000 < b> -04:00 &#34; - &gt;上午1点在-04:00偏移)。

一小时后(plusHours(1)),您应该在偏移-04:00时获得凌晨2点,但那是DST ends in New York:时钟设置为1小时回到凌晨1点的瞬间,偏移量更改为-05:00 - 这是A在-05:00凌晨1点的原因。

另一方面,

B已经在EST(不再是DST中),所以它在-05:00设置为凌晨2点。在A之后一小时。

当DST结束时,我们有这种奇怪的情况,其中本地时间存在两次(在这种情况下,凌晨1点到凌晨1点59分之间出现两次:在-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

答案 1 :(得分:1)

根据javadoc,您可以使用:

  • equals:基于毫秒时刻,年表和时区的平等
  • isEqual:此瞬间是否等于仅通过毫秒
  • 比较的瞬间

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