Date月份減一的時候?qū)嶋H上沒有減的情況

起因

是有這么一個功能需求,統(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容