如何编写更优雅的Groovy脚本实现季度格式日期字符串比对
优化实现方案
原来的代码核心问题是硬编码substring下标截取内容,只要字符串格式出现微小变动(比如前后多空格、年份位数变化)就会报错,优化后用正则匹配提取字段,容错性和扩展性都更好,代码也更简洁:
/** * 解析FY格式季度字符串,返回可直接比对的季度数值 * @param fyStr 格式为FYxx Qx的季度字符串,例如FY22 Q4 * @return 折算后的总季度数,可直接用于差值计算 */ def parseFyQtr(String fyStr) { // 正则匹配提取年份和季度,自动忽略前后多余空格 def matcher = (fyStr =~ /^\s*FY(\d{2})\s*Q(\d)\s*$/) if (!matcher.matches()) { throw new IllegalArgumentException("输入格式非法:${fyStr},要求格式为FYxx Qx") } int fullYear = 2000 + matcher[0][1] as int int quarter = matcher[0][2] as int return fullYear * 4 + quarter } // 调用示例 def vals = ["FY22 Q4","FY23 Q2"] def qtrDiff = parseFyQtr(vals[1]) - parseFyQtr(vals[0]) println qtrDiff
优化点说明
- 取消了硬编码的下标截取逻辑,用正则匹配提取字段,支持字符串前后带空格、年份和季度之间多空格的场景
- 新增格式校验,输入不符合规则时会抛出明确的错误提示,避免原代码可能出现的下标越界、类型转换失败等模糊报错
- 去掉了不必要的基准年参数,因为计算两个季度的差值时,基准年的数值会被抵消,不需要额外维护2010的基准值
- 封装为通用方法,可复用性更强,如果后续需要适配4位年份的格式(比如FY2022 Q4),只需要调整正则和年份转换逻辑即可
内容的提问来源于stack exchange,提问作者Hightower
相关产品推荐
相关产品推荐

