返回任意两个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("出错了"); }}; } } }

__EOF__

本文作者羊37
本文链接https://www.cnblogs.com/yang37/p/14375632.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   羊37  阅读(166)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示