2016-09-14 34 views
0

我有一個Origin-Destination矩陣,表示2分鐘之間的經過時間。我想知道什麼是將經過時間添加到日期的最佳方式。將代表分鐘的Double變量添加到Java中的Date中

 Date clock; 
     SimpleDateFormat reqDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
     clock = reqDF.parse(line[25]); 
     Double distance = distDB.find_distance(O, D, mode, facility_id); 
     Date current_time = clock + distance; 

如果我使用日曆類型而不是日期,它會更容易嗎?

感謝

+0

你爲什麼不創建自己的類恰好代表了你想要的。 –

+0

我不明白。? – Chopin

+0

也許我不明白。日期是'時間' - 距離與時間有關。如果你想存儲日期和距離 - 然後創建一個帶有日期字段和雙字段的類。 –

回答

1

TL;博士

Instant.parse("2016-12-23T01:23:45Z") 
     .plusNanos(Math.round( 
      yourNumberOfMinutesAsDouble * 
      TimeUnit.MINUTES.toNanos(1)) 
     ) 

避免舊日期時間類。

實際上,您應該既不使用java.util.Date也不使用java.util.Calendar。這些舊的遺留類別是衆所周知的麻煩,混亂和缺陷。現在由java.time類取代。

對於舊的類,Answer by Jireugi是正確的。對於java.time類,請繼續閱讀。

避免使用小數號碼經過時間

不使用doubleDouble表示經過時間是個好主意。首先,這種類型使用floating-point技術,這降低了執行速度的準確性。所以你的小數部分右邊通常會有多餘的數字。

其次,鑑於我們有六十秒到一分鐘,六十分鐘到一個小時等等,這是處理時間的一種尷尬的方式。

  • 在Java中,使用PeriodDuration類。見Oracle Tutorial
  • 在文本中,使用標準ISO 8601格式PnYnMnDTnHnMnS其中P表示開始,並且T將年 - 月 - 日與小時 - 分鐘 - 秒分隔開。所以兩分半鐘就是PT2M30S

納秒

如果我們必須與Double多項分鐘經過時間的工作,讓我們從你的分數的十進制數轉換爲整數(整數)。

請注意,舊的遺留日期 - 時間類被限制爲毫秒級的分辨率,而java.time類可以達到納秒級。所以我們想將你的Double轉換爲整數納秒。

我們使用TimeUnit枚舉,而不是在一分鐘內硬編碼一分鐘內的納秒數的幻數。該類可以爲我們計算一分鐘內的納秒數(60 * 1_000_000_000L)。

最後,Math.round函數返回最接近參數的長度,並將關係舍入到正無窮大。

long nanoseconds = Math.round( 
    yourNumberOfMinutesAsDouble * 
    TimeUnit.MINUTES.toNanos(1) 
); 

Instant

如果有日期時間值在UTC工作,使用Instant類。每個Instant代表UTC中時間軸上的一個時刻,分辨率爲nanoseconds

Instant Instant.parse("2016-12-23T01:23:45Z") 
Instant future = Instant.plusNanos(nanoseconds); 

Duration

而非Double周圍路過的你經過的時候,我強烈建議你通過周圍Duration對象。

Duration duration = Duration.ofNanos(Math.round(yourNumberOfMinutesAsDouble * TimeUnit.MINUTES.toNanos(1))); 

你可以做數學與Durationplusminus

Instant instant = Instant.parse("2016-12-23T01:23:45Z") 
Instant future = instant.plus(duration); 

您可以通過調用僅僅產生toStringDuration的標準ISO 8601格式的字符串表示,例如PT8H6M12.345S。而且Duration也可以解析這樣的字符串。

String output = duration.toString(); // PT8H6M12.345S 

...或去另一個方向......

Duration duration = Duration.parse("PT8H6M12.345S"); 
+0

非常感謝。 – Chopin

+0

豎起大拇指!讓我們使用新的更好的時間課程來生活在新的Java世界中。 – Jireugi

0

如果我瞭解你的情況,你想獲得當前的日期,然後使用矩陣[I,J]值(這是時間 - 以分鐘爲單位)要更新時間給的指示 - 如果你從Origin(i)開始,直到你到達Destination(j)的時間。 我寧願使用java的Calendar類。它給你更多的靈活性。使用'Calendar'類,你可以得到Time(),它返回'Date'類型的實例,然後使用這個類來添加/刪除你的時間偏移量(這個類有這種操作提供的方法),並將'Date'到日曆。

3

你可以試試這個使用Math.round

Date clock; 
SimpleDateFormat reqDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
clock = reqDF.parse(line[25]); 
Double distance = distDB.find_distance(O, D, mode, facility_id); 

long clockTimeMs = clock.getTime(); 
long distTimeInMs = Math.round(distance * 60000); 
Date current_time = new Date(clockTimeMs + distTimeInMs); 

這裏的日期被轉換成毫秒的時間戳。 由於距離以分鐘爲單位,因此在將其添加到開始時間(「時鐘」)之前,您需要將其轉換爲毫秒,並乘以60 * 1000(= 60000)。最後創建一個新的日期,表示距離開始時間的距離。

Date類在這裏請找到細節:https://docs.oracle.com/javase/6/docs/api/java/util/Date.html