我有两个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
如何比较A
和B
,看看它们是否是同一个实例?
仔细查看A
和B
的实例化方式。关键是A
和B
实际上指的是同一时刻,即纽约市从EDT到EST的时钟。
答案 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)