拆分年月,获取年及年的月份

文章讲述了在开发过程中,如何将数据库查询到的年月日格式数据(如2022-01-01)处理成Map<String,LinkedHashSet<String>>的结构,其中键为年份,值为该年的不重复月份集合。通过substring方法提取年份和月份,并使用LinkedHashSet保证月份的唯一性。最终将结果转化为自定义对象列表。
摘要由CSDN通过智能技术生成

最近开发的时候遇到这样一个问题 拆分年月日 获取年份以及当年的有数据的月份
需要的数据格式如下

"data": [
    {
      "months": [
        "01"
      ],
      "year": "2023"
    },
    {
      "months": [
        "12",
        "11"
      ],
      "year": "2022"
    }
  ]

因为每次去数据库查出来的数据都是年月日连在一起如"2022-01-01"而且是只需要年月取出来
那如果取出来"2022-01-01",“2022-02-01”,“2023-02-01”,。这样的年月日。该如何 处理
最后想到想把字符拆开前四位是年作为key然后用这个key去匹配这个数组拿到这个年的所有日期。然后这些日期拆出来月作为value。
但是又有问题了
比如一月有两个动态那取出的日期就是"2022-01-01",“2022-01-02”。那就不能直接拆出来月作为value会有重复月。我想到set可以去重。就把value作为一个set集合放进去。那取得时候就自动去重了。
最后做出来的接收集合是这样。

 Map<String, LinkedHashSet<String>> map = new HashMap<>();

然后就去测试

public class TestYear {
    public static void main(String[] args) {
        List<String> listTime = new ArrayList<>();
        listTime.add("2022-10-11");
        listTime.add("2022-11-11");
        listTime.add("2022-12-11");
        listTime.add("2023-10-11");
        listTime.add("2023-10-12");

        Map<String, LinkedHashSet<String>> map = new HashMap<>();

        for (String str : listTime) {
            String key = str.substring(0, 4);
            LinkedHashSet<String> list = map.get(key);
//如果map中对应key,创建String数组,并加到map中
            if (list == null || list.isEmpty()) {
                list = new LinkedHashSet<>();
                map.put(key, list);
            }
            list.add(str.substring(5,7));
        }
        System.out.println(map);
    }

}

最后我们得到的结果就是

{
2023=[10],
2022=[10, 11, 12]
 }

得到这种结果后基本就是我们想要的了,然后在放入我们自己的代码去稍微修改一下就成了。下面就是项目代码了

public AjaxResult getYear() {
        Date nowDate = DateUtil.date().toSqlDate();
        List<String> listTime = new ArrayList<>();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd ");
        //获取当天日期前的所有活动
List<AppActivityInformation>listAc=this.list(Wrappers<AppActivityInformation>lambdaQuery().le(AppActivityInformation::getActivityTime,nowDate)
.orderByAsc(AppActivityInformation::getActivityTime));
        if (ObjectUtils.isNotEmpty(listAc)) {
        //循环把日期放到一个list集合中
            for (AppActivityInformation appActivityInformation : listAc) {
                Date activityTime = appActivityInformation.getActivityTime();
                String format = formatter.format(activityTime);
                listTime.add(format);
            }
            //取出来年月的集合
            Map<String, LinkedHashSet<String>> map = new HashMap<>();
            for (String str : listTime) {
                String key = str.substring(0, 4);
                LinkedHashSet<String> list = map.get(key);
//如果map中对应key,创建String数组,并加到map中
                if (list == null || list.isEmpty()) {
                    list = new LinkedHashSet<>();
                    map.put(key, list);
                }
                list.add(str.substring(5,7));
            }
            //把map对象放到我们自己的集合中
            List<YearMonth> yearMonths = new ArrayList<>();
            for (String key : map.keySet()) {
                YearMonth yearMonth = new YearMonth();
                yearMonth.setYear(key);
                LinkedHashSet<String> month = map.get(key);
                //HaseSet不能倒排我们就转下list再去倒排
                ArrayList<String> list = new ArrayList<String>(month);
                Collections.reverse(list);
               yearMonth.setMonths(list);
                yearMonths.add(yearMonth);
            }
            return AjaxResult.success(yearMonths);
        }
       return AjaxResult.success();
    }

最后得到需要的结果。
小白一枚,做开发半年,烦请多多指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值