2012-05-13 50 views
2

以毫秒爲單位計算的日期代碼是:爲什麼Java的Date.getTime()返回1月份的錯誤響應?

//installment date converted to milliseconds 
long localDateInstall = installDate.getTime(); 

//installment date converted to milliseconds 
long localDatePay = payDate.getTime(); 

這裏我計算天的這些日期間數:

days=Math.abs((localDatePay - localDateInstall))/86400000; 

當我想測試它,我進入1/Jan/2012localDateInstall1/Feb/2012localDatePay。結果是:29天。問題是什麼?由於

+1

在您用來將這些日期映射到時間點的時區中,您可能會在1月1日到2月1日之間調整夏令時間嗎?換句話說,2012年1月的那個時區的任何一天都不是24小時? –

+0

http://stackoverflow.com/a/3300078/20394顯示如何使用喬達時間來獲取兩個日期之間的日子。 –

+0

'getTime()'只給你UTC的時間戳[here](http://docs.oracle.com/javase/6/docs/api/java/util/Date.html#getTime()) –

回答

13

反例:

public static void main(String[] args) throws Exception { 
    SimpleDateFormat format = new SimpleDateFormat("d MMM yyyy"); 
    Date installDate = format.parse("1 Jan 2012"); 
    Date payDate = format.parse("1 Feb 2012"); 
    long localDatePay = payDate.getTime(); 
    long localDateInstall = installDate.getTime(); 
    long days = Math.abs(localDatePay - localDateInstall)/86400000; 
    System.out.println(days); 
} 

這工作得很好,並且輸出爲 「31」,符合市場預期。問題出在你沒有告訴我們的地方。在黑暗中拍攝:您可能正在構建像這樣的測試輸入:

Date installDate = new Date(2012, 1, 1); 
Date payDate = new Date(2012, 2, 1); 

不幸的是,這在兩種方式中是錯誤的。首先,「年份」論據應該是「the year minus 1900」。其次,January is month 0, not month 1。以這兩個日期作爲輸入,你的確可以得到29的答案,因爲實際上你要求它是在3912年的2月份這個閏年的天數。

+0

它計算1月份的天數,不應受閏年的影響。 – phatfingers

+1

@phatfingers:再次讀下我寫的(下半場)。 –

+1

哎呀,很對。我收回我的評論(並會提高您的輸入)。 – phatfingers

0

你可以試試:

//installment date converted to milliseconds 
long localDateInstall=installDate.getTimeInMillis(); 

//installment date converted to milliseconds 
long localDatePay=payDate.getTimeInMillis(); 

long diff = localDatePay-localDateInstall; 

long diffInDays = diff/(24 * 60 * 60 * 1000);  
+0

如何是任何不同比什麼已經從沒有服用差的絕對值發生,一邊? –

0

我不認爲有足夠的信息去,但這裏有一些想法和追求。

  1. 您正在執行整數運算,這不圓的,而是截斷任何短一整天。如果您的一天結束時間比您的開始時間早一點,您將會失去一整天的時間。

  2. 確保沒有什麼有趣的事情發生在時區。這兩個日期是以相同的方式輸入的,還是來自不同的時間區域,可能有不同的時區?

  3. 如果您發佈了每個實際毫秒值和您的預期時區,則應該很容易確定兩者中的哪一個關閉。