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類,請繼續閱讀。
避免使用小數號碼經過時間
不使用double
或Double
表示經過時間是個好主意。首先,這種類型使用floating-point技術,這降低了執行速度的準確性。所以你的小數部分右邊通常會有多餘的數字。
其次,鑑於我們有六十秒到一分鐘,六十分鐘到一個小時等等,這是處理時間的一種尷尬的方式。
納秒
如果我們必須與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)));
你可以做數學與Duration
如plus
和minus
。
Instant instant = Instant.parse("2016-12-23T01:23:45Z")
Instant future = instant.plus(duration);
您可以通過調用僅僅產生toString
的Duration
的標準ISO 8601格式的字符串表示,例如PT8H6M12.345S
。而且Duration
也可以解析這樣的字符串。
String output = duration.toString(); // PT8H6M12.345S
...或去另一個方向......
Duration duration = Duration.parse("PT8H6M12.345S");
你爲什麼不創建自己的類恰好代表了你想要的。 –
我不明白。? – Chopin
也許我不明白。日期是'時間' - 距離與時間有關。如果你想存儲日期和距離 - 然後創建一個帶有日期字段和雙字段的類。 –