返回任意两个yyyyMM的差值

获取任意两个yyyyMM的差值

1.给定两个任意的年月值,格式为yyyyMM,返回其中的差值.

eg:输入"202002"与"202106",返回.

202003
202004
202005
202006
202007
202008
202009
202010
202011
202012
202101
202102
202103
202104
202105

2.参考代码

没有推敲细节,肯定可以优化,仅参考.

package main.cn.yang37.algorithm;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @Description: 给定两个yyyyMM返回中间的月份差yyyyMM
 * @Class: CalculateMonthDifference
 * @Author: Yiang37
 * @Date: 2021/2/4 22:34
 * @Version: 1.0
 */
public class CalculateMonthDifference {

    public static void main(String[] args) {

        List<String> list =  getDifferenceMonths("201809", "202011");
        for (String s : list) {
            System.out.println(s);
        }
    }


    public static List<String> getDifferenceMonths(String time1, String time2) {

        try {
            //正则校验入参格式..
            String bigStr;
            String lowStr;
            //判断年份大小
            if (Integer.parseInt(time1) > Integer.parseInt(time2)) {
                bigStr = time1;
                lowStr = time2;
            } else {
                bigStr = time2;
                lowStr = time1;
            }

            String bigYearStr1 = bigStr.substring(0, 4);
            String bigMonthStr1 = bigStr.substring(4, 6);
            String lowYearStr2 = lowStr.substring(0, 4);
            String lowMonthStr2 = lowStr.substring(4, 6);

            int bigYear = Integer.parseInt(bigYearStr1);
            int bigMonth = Integer.parseInt(bigMonthStr1);
            int lowYear = Integer.parseInt(lowYearStr2);
            int lowMoth = Integer.parseInt(lowMonthStr2);

            //月份差
            int range = 0;
            //数字型结果月份
            int resMonth = 0;
            //字符型结果月份
            String resMonthStr = "";

            //结果列表
            List<String> resList = new LinkedList<>();

            //同一年份
            if (bigYear == lowYear) {
                range = bigMonth - lowMoth;
                for (int i = 1; i < range; i++) {
                    //差值月份
                    resMonth = lowMoth + i;
                    //小于10的月份要补0
                    resMonthStr = resMonth > 9 ? "" + resMonth : "0" + resMonth;
                    resList.add("" + lowYear + resMonthStr);
                }
            }//年份是连续的
            else if (bigYear - lowYear == 1) {
                //小年月份距离12月的位置
                range = 12 - lowMoth;
                //小年份到年底十二月
                for (int i = 1; i <= range; i++) {
                    //差值月份
                    resMonth = lowMoth + i;
                    //小于10的月份要补0
                    resMonthStr = resMonth > 9 ? "" + resMonth : "0" + resMonth;
                    resList.add("" + lowYear + resMonthStr);
                }
                //大年份初到大年份当前
                for (int i = 1; i < bigMonth; i++) {
                    resMonth = i;
                    resMonthStr = resMonth > 9 ? "" + resMonth : "0" + resMonth;
                    resList.add("" + bigYear + resMonthStr);
                }

            }
            //年份是不连续的 2020 2025
            else {
                //计算中间整数倍的差值年份
                int yearRange = bigYear - lowYear;
                int tempYear = 0;
                String tempYearStr = "";
                String tempMonthStr = "";
                //外层控制年份
                for (int i = 1; i < yearRange; i++) {
                    tempYear = lowYear + i;
                    tempYearStr = "" + tempYear;
                    //内层控制年份
                    for (int j = 1; j <= 12; j++) {
                        tempMonthStr = j > 9 ? "" + j : "0" + j;
                        resList.add(tempYearStr + tempMonthStr);
                    }
                }

                //计算两边的差值月份 复用连续年份的算法
                //小年月份距离12月的位置
                range = 12 - lowMoth;
                //小年份到年底十二月
                for (int i = 1; i <= range; i++) {
                    //差值月份
                    resMonth = lowMoth + i;
                    //小于10的月份要补0
                    resMonthStr = resMonth > 9 ? "" + resMonth : "0" + resMonth;
                    resList.add("" + lowYear + resMonthStr);
                }
                //大年份初到大年份当前
                for (int i = 1; i < bigMonth; i++) {
                    resMonth = i;
                    resMonthStr = resMonth > 9 ? "" + resMonth : "0" + resMonth;
                    resList.add("" + bigYear + resMonthStr);
                }
            }

            //结果list由String转Integer
            List<Integer> list = resList.stream().map(s -> Integer.parseInt(s.trim())).collect(Collectors.toList());
            Collections.sort(list);
            //排序后的list再转回去String 我竟然又转回去??
            resList = list.stream().map(String::valueOf).collect(Collectors.toList());
            return resList;
        }catch (Exception e){
            return new ArrayList<String>(){{
                add("出错了");
            }};
        }
    }
}
原文地址:https://www.cnblogs.com/yang37/p/14375632.html