美文网首页
记一次calendar二月份的坑

记一次calendar二月份的坑

作者: 7a3fe179bf61 | 来源:发表于2020-03-30 11:06 被阅读0次

    记一次calendar二月份的坑

    需求是这样的:页面上传一个开始期间,一个结束期间,我需要根据开始和结束期间去数据库取数,又不想用大于等于和小于等于期间取数,因为需要使用函数对日期类型做转换,可能对性能会有影响,所以就计算出一共有哪些期间。例如:
    strartPeriod=2020-01, endPeriod=2020-05
    查询应该得到的结果是[2020-01,2020-02,2020-03,2020-04,2020-05]

    代码实现如下:

     private static List<String> getTerm(VATStatisticsSearchRequest reportSearchRequest) {
        String startPeriod = reportSearchRequest.getStartPeriod();
        String[] startYM = startPeriod.split("-");
        String endPeriod = reportSearchRequest.getEndPeriod();
        String[] endYM = endPeriod.split("-");
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, Integer.parseInt(startYM[0]));
        // 查看Calendar.MONTH的注释可知,1月份是0,所以月份需要-1设置才是正确的
        calendar.set(Calendar.MONTH, Integer.parseInt(startYM[1]) - 1);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM");
        List<String> terms = new ArrayList<>();
        while (calendar.get(Calendar.YEAR) == Integer.parseInt(endYM[0])
            && calendar.get(Calendar.MONTH) <= Integer.parseInt(endYM[1]) - 1) {
          String timeStr = simpleDateFormat.format(calendar.getTime());
          terms.add(timeStr);
          calendar.add(Calendar.MONTH, 1);
        }
        return terms;
      }
    

    写main方法测试结果也是正确的,唯独startPeriod=2020-02,endePeriod=2020-02就有问题了,输出的list为空集合。
    起初很是费解,其它任何一个月份都没问题,就只有2月份有问题,并且任何一年的二月份都有问题,这就很奇怪了,并且这个代码已经运行过一段时间,也没出现过这种情况。后来网上查了一下原话是这样的:
    比如你选择的时间是2019年1月31日,然后这个时候你对month进行修改改为2月你会发现你得到的month值是3月份,原因是2月份没有31天然后calendar会将时间是自动换算成3月份。
    一看今天日期果然到了月底,这个方法中没有对日期的设置,而Calendar.getInstance()正好会获取当前的时间,日期没有设置的话就会拿当前日期,所以就会出现2月份打印不出来的情况。奇怪的现象终于解释通了。长叹一口气~~~

    后边经过改造后的代码如下(设置了当前日期为1号):

    private static List<String> getTerm(VATStatisticsSearchRequest reportSearchRequest) {
        String startPeriod = reportSearchRequest.getStartPeriod();
        String[] startYM = startPeriod.split("-");
        String endPeriod = reportSearchRequest.getEndPeriod();
        String[] endYM = endPeriod.split("-");
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, Integer.parseInt(startYM[0]));
        calendar.set(Calendar.MONTH, Integer.parseInt(startYM[1]) - 1);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM");
        List<String> terms = new ArrayList<>();
        while (calendar.get(Calendar.YEAR) == Integer.parseInt(endYM[0])
            && calendar.get(Calendar.MONTH) <= Integer.parseInt(endYM[1]) - 1) {
          String timeStr = simpleDateFormat.format(calendar.getTime());
          terms.add(timeStr);
          calendar.add(Calendar.MONTH, 1);
        }
        return terms;
      }
    

    就不会出现离奇的"二月红"了 !

    相关文章

      网友评论

          本文标题:记一次calendar二月份的坑

          本文链接:https://www.haomeiwen.com/subject/mhimuhtx.html