一. 舊的方式
參考以前的博客:Java中日期容易計算錯誤的問題
1. 需求
取得當前時間前一周的時間。比如說:今天是2009-4-23,運行結果則為:2009-4-16。
代碼:一般人肯定會這樣寫:
String lastModified = new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date((new java.util.Date().getTime() - 7*24*60*60*1000)));
表面上看結果是正確的。
2. 問題
如果想取得當前時間前一個月的時間,直接修改上面的7為30,形如:30 * 24 * 60 * 60 * 1000,結果肯定不是你想要的2009-3-24。而是2009-5-13,你沒看錯!
3. 原因
java日期的數值表達值為long類型的,應該用long型參數去做操作。7 * 24 * 60 * 60 * 1000默認為整型操作,它沒有溢出;但30 * 24 * 60 * 60 * 1000對於整型來說是溢出的,變成負數,所以日期反而加大。
4. 解決
String lastModified = new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date((new java.util.Date().getTime() - (long)30*24*60*60*1000)));
這樣寫就可以解決問題了。
二. 新的方式
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd"); java.util.Calendar cal = java.util.Calendar.getInstance(); cal.setTime(sdf.parse("2009-4-23")); cal.add(java.util.Calendar.DATE, -7); // 向前一周;如果需要向后一周,用正數即可 // cal.add(java.util.Calendar.MONTH, -1); // 向前一月;如果需要向后一月,用正數即可 System.out.println(sdf.format(cal.getTime()));
這樣就可以取得一個月以前或者是一周以前的日期了。