3 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超7個(gè)贊
我知道簡(jiǎn)單的方法是將時(shí)間差以毫秒為單位,然后將其轉(zhuǎn)換為天。但是,我想知道這是否在所有情況下都有效(夏令時(shí)等)。
如果您的時(shí)間是從UTC日期得出的,或者它們僅僅是在同一系統(tǒng)上兩次調(diào)用System.getCurrentTimeMillis()的時(shí)間差,則您將獲得有效的毫秒數(shù),與任何時(shí)區(qū)問(wèn)題無(wú)關(guān)。(這就是為什么所有內(nèi)容都應(yīng)使用UTC作為存儲(chǔ)格式的原因-從UTC->當(dāng)?shù)貢r(shí)間開(kāi)始要容易得多;如果嘗試采用其他方式,則需要將本地時(shí)區(qū)與當(dāng)?shù)貢r(shí)間一起存儲(chǔ)-或嘗試推斷,g?。?/p>
至于將其轉(zhuǎn)換為幾天,您應(yīng)該可以除以86400000...。但要注意,每隔一年左右偶爾會(huì)有一次leap秒。

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊
在Java 8中使用Joda-Time或新的java.time包。
這兩個(gè)框架都使用Half-Open方法,其中開(kāi)始是包含在內(nèi)的,而結(jié)尾是排斥的。有時(shí)標(biāo)注為[)。通常,這是定義時(shí)間跨度的最佳方法。
java.time
Java 8及更高版本中內(nèi)置的java.time框架具有一個(gè)Period類(lèi),用于表示時(shí)間跨度,以年,月,日為單位。但是此類(lèi)僅限于整天,不能表示小時(shí),分鐘和秒。
請(qǐng)注意,我們指定了時(shí)區(qū),這對(duì)于確定日期至關(guān)重要。例如,巴黎的新天要比蒙特利爾早。
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。現(xiàn)在:2015-09-07。期間:P14Y8M6D。天數(shù):5362
對(duì)于整天,則夏令時(shí)(DST)無(wú)關(guān)緊要。
如果要計(jì)算總天數(shù),請(qǐng)使用ChronoUnit包含一些計(jì)算方法的枚舉。注意,計(jì)算返回很長(zhǎng)的時(shí)間。
long days = ChronoUnit.DAYS.between( then, now ); // "5362" seen above.
我曾問(wèn)過(guò)要在java.time中進(jìn)行一整段時(shí)間,包括小時(shí),分鐘,秒。不可能的,因?yàn)镴ava的8使用捆綁的庫(kù)令人驚訝的解決辦法的建議由梅諾爾德:使用Duration中發(fā)現(xiàn)了類(lèi)javax.xml.datatype中的包。
喬達(dá)時(shí)代
這是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 );
調(diào)用toString將獲得ISO 8601標(biāo)準(zhǔn)定義的形式的字符串表示形式PnYnMnDTnHnMnS。
添加回答
舉報(bào)