2011-06-22 43 views
9
Date nowdate = new Date(); 
long nowms = nowdate.getTime(); 
long differencems = numdaysback * 24 * 60 * 60 * 1000; 
long thenms = nowms - differencems; 
Date thendate = new Date(thenms); 

如果numdaysback是365,那麼我會假設該議案是一年前。但不是......大約三週前?!?Java日期問題,找到日期X天前

NUMDAYSBACK: 365 
NOWDATE: Wed Jun 22 20:31:58 SGT 2011 
NOWMS: 1308745918625 
DIFFERENCEMS: 1471228928 
THENMS: 1307274689697 
THENDATE: Sun Jun 05 19:51:29 SGT 2011 

回答

25

如何:

Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.YEAR, -1); 
Date thendate = cal.getTime(); 

返回一天的同一時間,無論DST還是閏年,更短,更清晰......

一般Calendar就是在這樣的路要走病例(除非您使用第三方庫,如喬達時間)。你可以使用它來進行各種計算:增加N天/小時/月/秒,截斷時間到一整小時等等 - 只有long纔會太痛苦。

關於你原來的問題,它似乎是整數溢出的犧牲品。它的工作原理,如果乘明確地使用長:

long differencems = 365 * 24 * 60 * 60 * 1000L; 
+0

很好的解決方案。現在它都按預期工作:) – Jesper

+3

+1告訴他什麼是錯的,而不是簡單地給出解決方案。 –

0

這條線:

long differencems = numdaysback * 24 * 60 * 60 * 1000; 

的RHS應該是:31536000000.你有東西要少得多,作爲RHS的原因被評價爲int (因爲所有數量都是整數),並且超出了MAX_INT。要糾正這個:

long differencems = numdaysback * 24 * 60 * 60 * 1000l; 

注意字母「l」,這使得1000是一個長期的 - 現在的RHS將被評估爲長。

+0

感謝大家。我會按照你所有的建議去看日曆。 – Jesper

3

就試試這個:

long differencems = numdaysback * 24L * 60 * 60 * 1000; 

有了新的代碼,你將不能鬆,由於整數乘法的數字。 由於我們將文字24標記爲long,所以乘法將通過將第一個操作數numdaysback自動轉換爲long來完成。乘法的其餘部分也將在很長的操作數上完成。

0

Date類(非正式)不贊成使用。這個API有很多錯誤,因此使用Dates/Times很困難。最簡單的例子就像你的代碼differencems。如果中間的時間包含夏令時開關(如果您不使用UT)並且總是無法處理閏秒,則會失敗。

如果您的應用程序依賴於正確的日期,則可能需要使用Joda Time