亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用Java計算日期差

用Java計算日期差

翻閱古今 2019-11-04 10:24:26
我覺得很有趣,Java(或java.util庫)沒有內置函數來計算日期差。我想從另一個減去一個日期,以獲得它們之間的經過時間。做這個的最好方式是什么?我知道簡單的方法是將時間差以毫秒為單位,然后將其轉換為天。但是,我想知道這是否在所有情況下都有效(帶夏令時等)。
查看完整描述

3 回答

?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

我知道簡單的方法是將時間差以毫秒為單位,然后將其轉換為天。但是,我想知道這是否在所有情況下都有效(夏令時等)。


如果您的時間是從UTC日期得出的,或者它們僅僅是在同一系統上兩次調用System.getCurrentTimeMillis()的時間差,則您將獲得有效的毫秒數,與任何時區問題無關。(這就是為什么所有內容都應使用UTC作為存儲格式的原因-從UTC->當地時間開始要容易得多;如果嘗試采用其他方式,則需要將本地時區與當地時間一起存儲-或嘗試推斷,g!)


至于將其轉換為幾天,您應該可以除以86400000...。但要注意,每隔一年左右偶爾會有一次leap秒。


查看完整回答
反對 回復 2019-11-04
?
慕村9548890

TA貢獻1884條經驗 獲得超4個贊

在Java 8中使用Joda-Time或新的java.time包。


這兩個框架都使用Half-Open方法,其中開始是包含在內的,而結尾是排斥的。有時標注為[)。通常,這是定義時間跨度的最佳方法。


java.time

Java 8及更高版本中內置的java.time框架具有一個Period類,用于表示時間跨度,以年,月,日為單位。但是此類僅限于整天,不能表示小時,分鐘和秒。


請注意,我們指定了時區,這對于確定日期至關重要。例如,巴黎的新天要比蒙特利爾早。


ZoneId zoneId = ZoneId.of( "America/Montreal" );

LocalDate now = LocalDate.now( zoneId );

LocalDate then = LocalDate.of( 2001, 1, 1 );

Period period = Period.between( then, now );

然后:2001-01-01?,F在:2015-09-07。期間:P14Y8M6D。天數:5362


對于整天,則夏令時(DST)無關緊要。


如果要計算總天數,請使用ChronoUnit包含一些計算方法的枚舉。注意,計算返回很長的時間。


long days = ChronoUnit.DAYS.between( then, now );  // "5362" seen above.

我曾問過要在java.time中進行一整段時間,包括小時,分鐘,秒。不可能的,因為Java的8使用捆綁的庫令人驚訝的解決辦法的建議由梅諾爾德:使用Duration中發現了類javax.xml.datatype中的包。


喬達時代

這是Joda-Time 2.3中的一些示例代碼。


DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );

DateTime start = new DateTime( 2014, 1, 2, 3, 4, 5, timeZone );

DateTime stop = new DateTime( 2014, 5, 2, 3, 4, 5, timeZone );

Period period = new Period( start, stop );

調用toString將獲得ISO 8601標準定義的形式的字符串表示形式PnYnMnDTnHnMnS。


查看完整回答
反對 回復 2019-11-04
  • 3 回答
  • 0 關注
  • 689 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號