年と月を分割して、その年の年と月を取得します

最近開発をしていて、年、月、日を分割して今年のデータを含む年と月を取得するという問題に遭遇しました。必要なデータ形式は次のとおりです

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


データベースにアクセスしてデータを確認するたびに、「2022-01-01」のように年、月、日がつながっていて、年と月だけが取り出されるからです。-01」、「2022-02-01」、「2023-02-01」、. そんな年、月、日。対処方法
最後に、西暦の最初の 4 桁をキーとして分割し、このキーを使用してこの配列と照合し、今年の日付をすべて取得することを考えました。次に、これらの日付が分割され、月が値として使用されます。
ただし、別の問題があり、
たとえば 1 月に 2 つの力学がある場合、取り出される日付は「2022-01-01」と「2022-01-02」になります。その場合、値として月を直接抽出することはできず、月が繰り返されることになります。セットで重複排除ができると思います。値をセットコレクションとして入れるだけです。取得すると、自動的に重複排除されます。
最終的な受信セットはこんな感じで作りました。

 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();
    }

最後に望ましい結果が得られます。
半年開発しているシャオバイさん、アドバイスをお願いします。

おすすめ

転載: blog.csdn.net/weixin_41438423/article/details/128575402