2016-10-18 118 views
3

我發現如何獲取兩個日期和分鐘數之間的小時數。我要的是他們兩人之間的確切差別,這是我使用的代碼:兩個Java日期對象之間的小時數+分鐘數

private String getHours(Message punch) { 
    LocalTime out = Instant.ofEpochMilli(message.getOut().getTime()).atZone(ZoneId.of(message.getTimezone())) 
      .toLocalTime(); 
    LocalTime in = Instant.ofEpochMilli(message.getIn().getTime()).atZone(ZoneId.of(message.getTimezone())) 
      .toLocalTime(); 
    Duration duration = Duration.between(in, out); 
    Long hours = duration.toHours(); 
    Long minutes = duration.toMinutes() - (hours * Constants.MINUTES_IN_AN_HOUR); 
    return String.format("%d:%d", hours, minutes); 

} 

它工作正常進行的情況下,主要的,但我有在以下情況下的錯誤:

  • message.getIn()返回:12:59
  • message.getOut()返回:22:00

兩者都是同一天,我期待不同的是9 :01,但我得到-14:-59

調試代碼我意識到,出來的是04:00,並在獲得18:59。

對於幾乎所有的情況它運作良好,但它發生在一些情況。

+0

當您將參數切換爲Duration.between時會發生什麼? –

+0

Plse檢查此代碼是否有幫助 –

+0

http://stackoverflow.com/a/39614758/4247543 –

回答

2

我相信你的問題是你正在使用LocalTime類,但你應該使用LocalDateTime類。它表明你的時區是格林威治標準時間+6,所以在你的例子中你的時間和時間在不同的日子裏 - 你在前一天的晚上時間和在第二天早上的時間。但是因爲你使用的是LocalTime,你就失去了那些在不同日子裏時代的事實。改變你的LocalTimeLocalDateTime,看看這是否有幫助

+0

謝謝你作爲正確的答案 –

0

你正在努力工作,在你的代碼中經歷了太多的迴轉。

使用Instant

你有一雙Instant對象,但把它們扔掉。使用它們。瞬時是UTC時間線上的具體時刻,分辨率爲納秒。

Instant start = … ; 
Instant stop = … ; 
Duration d = Duration.between(start , stop); 

你如何得到你的瞬間是一個謎。如果您修改您的問題以解釋您輸入的確切性質,我會在此提供更多代碼。

如果您正在通過一對java.util.Date對象,請將它們轉換爲Instant。使用新的轉換方法添加到舊的日期時間類。完全不需要時區來計算經過時間。

Instant start = utilDateX.toInstant() ; 
Instant stop = utilDateY.toInstant() ; 
Duration d = Duration.between(start , stop); 

計算經過時間LocalTime很少是合適的,因爲跨越到下一個或前幾天的。

相關問題