Scala中不转换为Date类型如何比较字符串日期判断月份差
字符串日期比较(不转Date类型)实现方案
前提说明
给定两个固定为YYYY-MM-DD格式的字符串日期:
a = '2021-05-23'(原题输入漏写末尾单引号,已修正格式)b = '2021-04-24'(原题输入末尾误写双引号,已修正格式)
要求不允许将字符串转换为Date类型,实现函数判断:当b比a的日期大1个自然月时返回true,否则返回false。
实现思路
因为日期字符串是严格的年-月-日横杠分隔格式,直接拆分字符串提取年、月、日的数值做算术运算即可,完全不需要依赖Date对象:
- 将两个日期字符串按
-分割,分别转成整数类型的年、月、日 - 用「年*12 + 月」的方式计算两个日期的总月份值,差值为1才满足月份差要求
- 根据业务需求补充日期部分的判断:如果要求b的日期不早于a的月度对日,再加一层日字段的数值比较即可
代码实现(JavaScript)
function isBGreaterThanAByOneMonth(a, b) { // 拆分提取年/月/日整数值 const [aYear, aMonth, aDay] = a.split('-').map(numStr => parseInt(numStr, 10)); const [bYear, bMonth, bDay] = b.split('-').map(numStr => parseInt(numStr, 10)); // 校验月份差恰好为1,自动兼容跨年场景 const totalMonthDiff = (bYear * 12 + bMonth) - (aYear * 12 + aMonth); if (totalMonthDiff !== 1) return false; // 若业务规则为「只要跨1个自然月就算,无需对齐日期」,删除下面这行判断直接返回true即可 return bDay >= aDay; }
测试用例参考
- 入参
a='2021-05-23', b='2021-06-23'→ 返回true - 入参
a='2021-05-23', b='2021-06-22'→ 返回false - 入参
a='2021-12-03', b='2022-01-05'→ 返回true(跨年场景正常识别) - 入参
a='2021-05-23', b='2021-04-24'→ 返回false(即题目给出的b值,月份差为-1不满足要求)
注意:如果输入的字符串可能存在格式不合法、前后多余引号/空格的情况,可以在拆分前先加一步字符串清洗,用
replace方法去掉非数字和横杠的字符即可。
内容的提问来源于stack exchange,提问作者stdinstoud
相关产品推荐
相关产品推荐

