3 回答

TA貢獻1784條經驗 獲得超7個贊
我知道簡單的方法是將時間差以毫秒為單位,然后將其轉換為天。但是,我想知道這是否在所有情況下都有效(夏令時等)。
如果您的時間是從UTC日期得出的,或者它們僅僅是在同一系統上兩次調用System.getCurrentTimeMillis()的時間差,則您將獲得有效的毫秒數,與任何時區問題無關。(這就是為什么所有內容都應使用UTC作為存儲格式的原因-從UTC->當地時間開始要容易得多;如果嘗試采用其他方式,則需要將本地時區與當地時間一起存儲-或嘗試推斷,g!)
至于將其轉換為幾天,您應該可以除以86400000...。但要注意,每隔一年左右偶爾會有一次leap秒。

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。
添加回答
舉報