最近寫了一個支付寶微信對帳報表,發現系統金額比支付寶微信的少好多,左查右查發現是追繳金額沒統計到,再一查發現月結束日期爲2019-09-31,9月咋會有31,爲啥呢就追繳金額不行呢,由於其餘類型用TIMESTAMP即便9.31不對也能統計到,而追繳用的時間戳存爲int值,UNIX_TIMESTAMP('2019-09-31 23:59:59')轉換爲0.000000致使結束時間不對where條件查詢就有問題。微信
在仔細一查發現工具類中有一個獲取月份最大值,問題就出如今這裏咯。代碼很簡單工具
public static int LastDay(int month) { Calendar calendar = Calendar.getInstance(); //獲取當前時間 calendar.set(Calendar.MONTH, month-1); //設置月份 int maxday =calendar.getActualMaximum(Calendar.DAY_OF_MONTH); //獲取最大值 return maxday; }
而後我發現不管傳什麼進去最大值都是31。spa
在System.out.println(calendar.getTime());打印出當前時間看看。發現若是傳進去的月份有31號,那麼就打印當月31號,若是沒有31號就爲下個月的1號。輸入二月時輸出爲3號。debug
輸入二月份debug一下,code
Calendar.getInstance()值爲2019-10-31以下圖orm
calendar.set(Calendar.MONTH, 2-1)設置爲二月以下圖,發現DAY_OF_MONTH=31,依然爲31號blog
System.out.println(calendar.getTime())一下,輸出爲2019-03-03,2019-02-31轉爲2019-03-03支付寶
calendar.getActualMaximum(Calendar.DAY_OF_MONTH)輸出值爲31,因而可知,不能只設置月份,要整個clear掉,從新設置年月,這樣纔會根據月份取最大值,否則會取到DAY_OF_MONTH的值。get
解決方案一:io
/** * 獲取某年某月的日期最大值 * @param year 年份 * @param month 月份 * @return 最大值 */ public static int LastDay(int year , int month) { Calendar calendar = Calendar.getInstance(); calendar.clear(); //清除全部日期數據 if (year != 0 ) { calendar.set(Calendar.YEAR, year); } calendar.set(Calendar.MONTH, month-1); int maxday =calendar.getActualMaximum(Calendar.DAY_OF_MONTH); return maxday; }
解決方案二:
/** * 根據年月獲取當月最後一天 * @param yearmonth yyyy-MM * @return yyyy-MM-dd * @throws ParseException */ public static String getLastDayOfMonth(String yearmonth) { try { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM"); Date dd = format.parse(yearmonth); Calendar cal = Calendar.getInstance(); cal.setTime(dd); int cc=cal.getActualMaximum(Calendar.DAY_OF_MONTH); String result = yearmonth+"-"+cc; return result; } catch (ParseException e) { e.printStackTrace(); } return null; }