起因
是有這么一個(gè)功能需求悟泵,統(tǒng)計(jì)最近四個(gè)月的訂單情況,我的想法是獲取當(dāng)前時(shí)間點(diǎn)這個(gè)月的開始的第一秒和結(jié)束的第一秒以及前三個(gè)月的開始第一秒結(jié)束第一秒這個(gè)時(shí)間段搔谴,我是通過(guò)date.setMonth來(lái)設(shè)置月份以便跳到上一個(gè)月的
Date date = Date.valueOf("2016-12-31");//當(dāng)前時(shí)間
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";
}
測(cè)試上線魁袜,沒啥問(wèn)題
但是到了2016年12月31日的時(shí)候發(fā)現(xiàn)統(tǒng)計(jì)的內(nèi)容居然有兩個(gè)最近一月桩撮,然后我就寫了上面那段代碼敦第,發(fā)現(xiàn)運(yùn)行的結(jié)果是這樣的
before=11
after=11
before=11
after=10
before=10
after=9
也就是說(shuō)有兩次11月的
原因
可以看Java源代碼的setMonth的注釋得到原因
2016-12-31被減去了一個(gè)月如果用Date計(jì)算的話,結(jié)果是2016-11-31店量,但是根本沒有2016-11-31這一天芜果,所以系統(tǒng)把他進(jìn)位了到了2016-12-1,所以造成了第一次for的時(shí)候輸出兩個(gè)都是11,2016-10-31也有這一種情況融师。
解決辦法
使用Calendar來(lái)進(jìn)行日期的計(jì)算
上文中的代碼如果使用Calender來(lái)計(jì)算的話是這樣的
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));
}
涉及日期計(jì)算最好使用Calendar