Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 跨EST EDT比较两个joda DateTime实例_Java_Datetime_Jodatime_Dst_Datetime Comparison - Fatal编程技术网

Java 跨EST EDT比较两个joda DateTime实例

Java 跨EST EDT比较两个joda DateTime实例,java,datetime,jodatime,dst,datetime-comparison,Java,Datetime,Jodatime,Dst,Datetime Comparison,我有两个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() +",

我有两个
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。

要进行比较,您正确地使用了
equals
。但它返回的是
false
,因为它们不是同一时间点。如果你查看它们的值,你会发现
A
实际上比
B
早一个小时:

A:2018-11-04T01:00:00.000-05:00,等时学[美国/纽约],ms1541311200000
B:2018-11-04T02:00:00.000-05:00,等时学[美国/纽约],ms1541314800000

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

这是因为
新的日期时间(2018,11,4,1,00,0)
生成的日期/时间仍然在EDT中(“2018-11-04T01:00:00.000-04:00”->凌晨1点在-04:00偏移)

一个小时后(
plusHours(1)
),您应该得到凌晨2点的偏移量-04:00,但这就是:时钟设置为凌晨1小时,偏移量更改为-05:00的时刻-这就是为什么
A
是凌晨1点-05:00

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


当DST结束时,我们会遇到这样一种奇怪的情况:本地时间存在两次(在这种情况下,凌晨1点到1:59之间的时间出现两次:在-04:00偏移中,然后在-05:00偏移中),而Joda time默认选择DST转换之前的偏移(-04:00)

不过,您可以使用
WithLaterOffsetToVerlap()
覆盖此项,它将在DST结束后获取偏移量

//创建新日期时间2018-11-04T01:00:00.000-04:00
DateTime A=新的日期时间(2018,11,4,1,00,0)
//DST结束后调整到偏移量(2018-11-04T01:00:00.000-05:00)
.带有侧向偏移的重叠()
//加1小时
.plusHours(1);
日期时间B=新的日期时间(2018,11,4,2,00,0);
//现在A和B是同一瞬间
System.out.println(A.equals(B));//真的

根据javadoc,您可以使用:

  • :基于毫秒瞬间、时间顺序和时区的相等性
  • :该瞬间是否等于以毫秒为单位传递的瞬间

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

我的问题是关于如何比较,而不是如何创建DateTime实例,因为我没有创建这些实例。但事实仍然是,无论你选择通过EST还是EDT来表示,它们都代表着相同的实际时刻。这就像说10/5和8/4这两个比率是不同的,但它们的计算结果是相同的,即2。所以当我比较10/5和8/4时,我可以使用10/5==8/4。声称它们不是同一个实例是错误的,因为当我转换为UTC时,两者都会给出准确的结果same@Norcal如果
getMillis()
返回不同的值,那么它们不是同一时刻-它们不对应于同一UTC时刻,只需调用
toInstant()
即可看到A和B是不同的。我只是根据问题中的代码解释为什么A和B不同。如果你仍然认为他们是一样的,我也无能为力。好luck@Norcal无论如何,使用
equals
是比较的正确方法,因此如果它返回
false
,那么它们就不一样了。您的输出显示A是凌晨1点,B是凌晨2点,因此我无法看到它们是如何相同的。也许您在美国/纽约不是默认时区的环境中进行了测试-在这种情况下,A和B将是相同的。但当默认时区是美国/纽约时,这似乎是事实,那么我在回答中提到的DST效应(实际上,这就是我可以复制错误的方式-通过将默认时区设置为纽约,因为使用另一个时区,这不会发生)-我当然只是猜测。如果你说它们是一样的,为什么问题中的输出显示A和B的不同值?@Norcal只是想说明一下,A和B不一样,因为它们的计算结果不一致<代码>A是
2018-11-04T01:00:00.000-05:00
,转换为UTC(使用
A.toInstant()
)我得到
2018-11-04T06:00:00.000Z
,而
B
2018-11-04T02:00:00.000-05:00
,转换为UTC(
B.toInstant()
)会得到
2018-11-04T07:00:00.000Z
。使用您在问题中提供的代码(根据
getchronoloy()
的输出,假设默认时区为America/New_York),A比B早一小时,因此它们不相同。