天天看點

Calendar類set方法中的坑

最近寫了一個支付寶微信對賬報表,發現系統金額比支付寶微信的少好多,左查右查發現是追繳金額沒統計到,再一查發現月結束日期為2019-09-31,9月咋會有31,為啥呢就追繳金額不行呢,因為其他類型用TIMESTAMP即使9.31不對也能統計到,而追繳用的時間戳存為int值,UNIX_TIMESTAMP('2019-09-31 23:59:59')轉換為0.000000導緻結束時間不對where條件查詢就有問題。

在仔細一查發現工具類中有一個擷取月份最大值,問題就出現在這裡咯。代碼很簡單

然後我發現無論傳什麼進去最大值都是31。

在System.out.println(calendar.getTime());列印出目前時間看看。發現如果傳進去的月份有31号,那麼就列印當月31号,如果沒有31号就為下個月的1号。輸入二月時輸出為3号。

輸入二月份debug一下,

Calendar.getInstance()值為2019-10-31如下圖

Calendar類set方法中的坑

calendar.set(Calendar.MONTH, 2-1)設定為二月如下圖,發現DAY_OF_MONTH=31,依然為31号

Calendar類set方法中的坑

System.out.println(calendar.getTime())一下,輸出為2019-03-03,2019-02-31轉為2019-03-03

Calendar類set方法中的坑

calendar.getActualMaximum(Calendar.DAY_OF_MONTH)輸出值為31,由此可見,不能隻設定月份,要整個clear掉,重新設定年月,這樣才會根據月份取最大值,不然會取到DAY_OF_MONTH的值。

解決方案一:

解決方案二: