2013-09-22 55 views
5

出了什麼問題?我假設如果我從1980年1月1日0:0:0減去1ms,那麼我得到了1979年。但是我必須爲此減去約500ms以上。請給我一個提示。減1ms會導致意外行爲

val cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")) 
cal.set(1980, 0, 1, 0, 0, 0) 
val date = new Date 
date.setTime(cal.getTimeInMillis()) // <- 1980 Jan 01 0:0:0 
date.setTime(cal.getTimeInMillis() - 1) // <- 1980 Jan 01 0:0:0 too !!! 

已更新。

的解決方案是

val cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")) 
cal.setTimeInMillis(0) 
cal.set(1980, 0, 1, 0, 0, 0) 
+0

只是一個猜測,但也許內部日曆輪到秒? – Aaron

+0

嘗試在第一個'setTime()'調用後打印'date'內容。也許年,月,日,小時,分和秒是你設定的值,但不是毫秒。 –

+0

這有點令人困惑。我不想使用尤達時間或另一個第三部分庫。我需要將年,月,日轉換爲毫秒,然後獲取當天的最後毫秒。我想爲此找到正確的解決方案。不幸的是,javadoc對這種情況保持沉默。 – Ezhik

回答

5

隨着Calendar.set(year, month, day, hourOfDay, minute, second)沒有毫秒被設置。因此,Calendar實現將毫秒設置爲「未知」,實際上它被視爲給定秒內的中點。

減500ms意味着你只是跨過中點。如果添加500毫秒,應該會發生同樣的情況,這應該會在第二秒之後纔會出現。實際上減去500ms的作品,你必須加上620ms才能看到下一秒。

+0

如何正確獲取1979年的最後一個毫秒? – Ezhik

+0

減去500ms不一定會給出1979年的最後一個毫秒。 –

+0

@Ezhik,用'calendar.set(Calendar.MILLISECOND,0)'明確設置毫秒。當你從中減去1毫秒時,你直接得到1979年的最後一毫秒。 – jboi