起因
是有這么一個功能需求,統(tǒng)計最近四個月的訂單情況,我的想法是獲取當前時間點這個月的開始的第一秒和結(jié)束的第一秒以及前三個月的開始第一秒結(jié)束第一秒這個時間段,我是通過date.setMonth來設(shè)置月份以便跳到上一個月的
Date date = Date.valueOf("2016-12-31");//當前時間
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
String month = format.format(date);
String start = month + "-01 00:00:00";
String end = month + "-31 23:59:59";
for(int i = 0; i < 3; i++) {
System.out.println("before=" + date.getMonth());
int temp = date.getMonth()-1;
date.setMonth(temp);
System.out.println("after=" + date.getMonth());
month = format.format(date);
start = month + "-01 00:00:00";
end = month + "-31 23:59:59";
}
測試上線,沒啥問題
但是到了2016年12月31日的時候發(fā)現(xiàn)統(tǒng)計的內(nèi)容居然有兩個最近一月,然后我就寫了上面那段代碼,發(fā)現(xiàn)運行的結(jié)果是這樣的
before=11
after=11
before=11
after=10
before=10
after=9
也就是說有兩次11月的
原因
可以看Java源代碼的setMonth的注釋得到原因
2016-12-31被減去了一個月如果用Date計算的話,結(jié)果是2016-11-31,但是根本沒有2016-11-31這一天,所以系統(tǒng)把他進位了到了2016-12-1,所以造成了第一次for的時候輸出兩個都是11,2016-10-31也有這一種情況。
解決辦法
使用Calendar來進行日期的計算
上文中的代碼如果使用Calender來計算的話是這樣的
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
java.util.Date date = calendar.getTime();
System.out.println(format.format(date));
for(int i = 0; i < 3; i++) {
calendar.add(Calendar.MONTH, -1);
java.util.Date temp = calendar.getTime();
System.out.println(format.format(temp));
}
涉及日期計算最好使用Calendar