2015-12-02 57 views
2

如果我嘗試減去1至29天,則返回日期是正確的,但如果我嘗試扣除超過30天,則返回日期錯誤。任何人都可以解釋我要去哪裏嗎?爲什麼減去超過30天導致錯誤的答案

public class MapTesting { 
    public static void main(String[] args) { 
     Date dNow = new Date(); 
     SimpleDateFormat ft = new SimpleDateFormat ("yyyy-dd-MM"); 

     try { 
      Date date = ft.parse("2011-01-10"); 
      Date su=new Date(date.getTime()-30*24*3600*1000); 
      System.out.println(su); 
      System.out.println(date); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
+0

你預計什麼輸出你要和:如果您指定的長值代碼工作? –

+0

當您逐步調試調試器中的代碼時,發現了什麼? – csmckelvey

+3

使用30 * 24 * 3600 * 1000L – ashiquzzaman33

回答

8

你在int常量中有溢出:30 * 24 * 3600 * 1000。

嘗試投整數長: Date su=new Date(date.getTime() - 30 * 24 * 3600 * 1000L);

+2

我發現區分是否使用大寫L而不是小寫更容易。很容易把'30l'換成'301',而把'30L'弄錯。 – JonK

3

這是因爲整數下溢/溢出。

當一個整數變得太高時,它將從正到負。

的這個例子:

System.out.println(24*24*3600*1000); // = 2073600000 
System.out.println(25*24*3600*1000); // = -2134967296 

當我們慶祝新千年,人們也害怕這個,當他們走到99溢出到00

要解決這個問題,你可以投1的數字到一個長由30l*24*3600*1000

2

由於@ antonu17提到,你有溢出錯誤。

如果您想要日期前後的日期,則可以直接在日曆對象上執行該計算。

Calendar cal = Calendar.getInstance(); 
cal.add (Calendar.DAY_OF_MONTH, (-/+)30); //you can add - sign to 30 if you want current date -30 days. 

然後從這個日曆對象中獲取日期。

+0

也看看http://www.joda.org/joda-time/ – antonu17

+1

是的,但我個人感覺,直到它可以使用內置的類爲什麼使用第三方庫或api。 –

2

Date構造函數需要很長的值。

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class MapTesting { 
    public static void main(String[] args) { 
     Date dNow = new Date(); 
     SimpleDateFormat ft = new SimpleDateFormat("yyyy-dd-MM"); 

     try { 
      Date date = ft.parse("2011-01-10"); 
      Date su = new Date(date.getTime() - 30L * 24L * 3600L * 1000L); 
      System.out.println(su); 
      System.out.println(date); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

多數民衆贊成在這一天的最佳解釋....構造期待長...嗯...好吧,我現在明白了 – user1742919