• 返回任意两个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("出错了");
                }};
            }
        }
    }
    
  • 相关阅读:
    BZOJ 1036 [ZJOI2008]树的统计Count(动态树)
    HDU 4010 Query on The Trees(动态树)
    Bootstrap框架
    【价格谈判】——在生意场合胜出的50个谈判绝招
    导出
    邓_ Php·魔术方法
    邓_tp_笔记
    UI 网页三原色
    邓_ 表单验证
    邓_ ThinkPhp框架
  • 原文地址:https://www.cnblogs.com/yang37/p/14375632.html
Copyright © 2020-2023  润新知