2013-06-18 153 views
25

我正在处理与此处要求的内容非常相似的内容 - compare Joda-Time time zones,但它似乎不适用于我。比较两个Joda-Time DateTime对象

这里有一段代码,我正与测试Joda-TimeDateTime -

DateTime estDT = new DateTime(DateTimeZone.forID("America/Puerto_Rico")).withMillisOfSecond(0); 
DateTime londonDT = new DateTime(DateTimeZone.forID("Europe/London")).withMillisOfSecond(0); 

    System.out.println("Comparison " + londonDT.isBefore(estDT)); 
    System.out.println("Comparison " + londonDT.isAfter(estDT)); 

有趣的是,我从上面这两种系统输出语句“假”。任何人都可以请解释什么是做这种比较的正确方法?

回答

14

您正在创建两个DateTime实例,它们可能代表相同的即时时间,但具有不同的时区。两者之间或之后都不是。

时区只影响日期/时间方法如getHourOfDay()如何转换即时时间。

+1

技术上,londonDT代表了片刻后,* * estDT作为宇宙的时间轴上的点。两行独立的代码意味着两个独立的计算机时钟采样,所以第二行比第一行晚。 DateTime的分辨率为毫秒,所以如果这两行代码恰好在计算机时钟的同一毫秒内执行,那么它们将彼此相等。这是纯粹的运气(机会)。根据Java线程在执行期间是否延迟/挂起,或者如果它运行在较慢的计算机上,这两个DateTime可能会有所不同。 –

+0

我们都有点太强大了。考虑到调用withMillisOfSecond(0),这两个*可能*表示同一时刻。但是,如果它们碰巧在不同的秒数上执行(例如,millis = 999和millis = 0),它们可能会有所不同。如果实际上需要相同的时间,那么withZone()方法比获得两次瞬间更可靠。然而,更可能的是OP需要两个不同的实例,作为输入提供。 –

44

isAfterisBefore方法比较毫秒(忽略时区)的日期。

在你的例子中,日期有相等的millis。

System.out.println(londonDT.getMillis() == estDT.getMillis()); 

将打印true

表达式

londonDT.isBefore(estDT) 
londonDT.isAfter(estDT) 

等于

londonDT.getMillis() < estDT.getMillis() 
londonDT.getMillis() > estDT.getMillis()