Calendar類set方法中的坑


最近寫了一個支付寶微信對賬報表,發現系統金額比支付寶微信的少好多,左查右查發現是追繳金額沒統計到,再一查發現月結束日期為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。

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

輸入二月份debug一下,

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

 

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

 

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的值。

 

解決方案一:

    /**
     * 獲取某年某月的日期最大值
     * @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;
     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM