zoukankan      html  css  js  c++  java
  • 返回任意两个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("出错了");
                }};
            }
        }
    }
    
  • 相关阅读:
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
  • 原文地址:https://www.cnblogs.com/yang37/p/14375632.html
Copyright © 2011-2022 走看看