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。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;
     }
相关文章
相关标签/搜索