2017-07-07 50 views
3

我preaparing爲Java OCP測試,並在模擬測試有這樣的關於Java的DateTime一個問題:鑑於紐約當在Java中的DateTime的Duration.between()返回負值

比洛杉磯快3小時,下面的代碼會打印什麼 ?

LocalDateTime ldt = LocalDateTime.of(2017, 12, 02, 6, 0, 0);   
ZonedDateTime nyZdt = ldt.atZone(nyZone); 
ZonedDateTime laZdt = ldt.atZone(laZone); 
Duration d = Duration.between(nyZdt, laZdt); 
System.out.println(d); 

與正確答案是PT3H但我是一個有點困惑在這裏,如果書中給出錯誤的答案或沒有?

鑑於紐約時間比洛杉磯提前3小時,是否意味着,例如,紐約是5:00,然後洛杉磯將是2:00。所以Duration.between(5,2)應該是PT-3H因爲根據的Javadoc:The result of this method can be a negative period if the end is before the start. To guarantee to obtain a positive duration call abs() on the result.,並且在這種情況下「2」之前「5」所以結果應該是PT-3H,不是PT3H。

您認爲哪一個是正確的?

+0

在洛杉磯早上6點的時候,紐約市早上9點。所以在洛杉磯早上6點在紐約時間上午3點發生。 –

+0

對於次要的nit:除非你真的打算以八進制編寫它們,否則不要將整數文字前綴爲零。 –

+1

在你的例子中,'nyZdt' =紐約早上6點,在**'laZdt' =洛杉磯早上6點之前是3小時**,所以在開始之前結束時不是**。 – Jesper

回答

3

Duration.between返回兩個時刻之間的差異。對於LocalDateTime,這意味着正確的答案需要規範化時區。由於洛杉磯當地小時的時間爲,其後比紐約時段的結果爲正。

在紐約的上午6:00,這是凌晨3點在洛杉磯,這意味着3小時將到達洛杉磯的上午6:00。 相反,在洛杉磯的上午6:00,紐約的上午9:00,這意味着自紐約上午6:00以來已經有3小時的時間過去了。

LocalDateTime ldt = LocalDateTime.of(2017, 12, 02, 6, 0, 0);   
ZonedDateTime nyZdt = ldt.atZone(nyZone); // 6:00 AM NY = 3:00 AM LA 
ZonedDateTime laZdt = ldt.atZone(laZone); // 6:00 AM LA = 9:00 AM NY 
Duration d = Duration.between(nyZdt, laZdt); // 9:00 AM NY - 6:00 AM NY = 3H OR 3:00 AM LA - 6:00 AM LA = 3H 
0

3小時是正確的。只需運行該代碼..

@Test 
public void test1() throws Exception { 

    LocalDateTime ldt = LocalDateTime.of(2017, 12, 02, 6, 0, 0); 
    ZonedDateTime nyZdt = ldt.atZone(ZoneId.of("America/New_York")); 
    ZonedDateTime laZdt = ldt.atZone(ZoneId.of("America/Los_Angeles")); 
    Duration d = Duration.between(nyZdt, laZdt); 
    System.out.println(d.toHours()); 


} 
+0

雖然這在技術上可能是正確的,但這不是問題的答案,該問題明確指出:「鑑於紐約比洛杉磯快3小時,下面的代碼會打印出什麼?」 – kewne

+0

@kewne更新了我的答案,它將打印3。 – Jobin

0

另一種方法將是nyZdtlaZdt轉換爲Instant

LocalDateTime ldt = LocalDateTime.of(2017, 12, 02, 6, 0, 0); 

ZoneId nyZone = ZoneId.of("America/New_York"); 
ZonedDateTime nyZdt = ldt.atZone(nyZone); 
System.out.println(nyZdt.toInstant()); //Prints 2017-12-02T11:00:00Z 

ZoneId laZone = ZoneId.of("America/Los_Angeles"); 
ZonedDateTime laZdt = ldt.atZone(laZone); 
System.out.println(laZdt.toInstant()); //Prints 2017-12-02T14:00:00Z 

Duration d = Duration.between(nyZdt, laZdt); 
System.out.println(d); //Prints PT3H 

在本例中,您可以更清楚地看到爲什麼減號不會出現在輸出中。正如你可以看到end不是之前start。開始爲2017-12-02T11:00:00Z,結束爲2017-12-02T14:00:00Z,換句話說,LA在NY之後,所以區別在於:PT3H