zoukankan      html  css  js  c++  java
  • 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;
         }
  • 相关阅读:
    使用winmm.dll 获取麦克风声音数据
    什么是拆箱和装箱?
    C#窗体程序【用户控件-窗体】委托事件
    如何在网页标题栏加入logo图标?
    C#汉字转拼音帮助类
    JQuery中$.ajax()方法参数详解
    UEditor独立图片、文件上传模块
    SqlServer2008安装时提示重启计算机失败 解决办法
    如果说人生是自我编写的程序
    LINQ的Any() 方法
  • 原文地址:https://www.cnblogs.com/aeolian/p/11769857.html
Copyright © 2011-2022 走看看