如何将逗号分隔的日期字符串合并为连续日期区间与单独日期列表
日期连续区间合并实现方案
完全可以通过拆分字符串、逐一遍历日期的方式实现需求,核心逻辑简单,不需要引入复杂依赖,具体实现步骤如下:
- 第一步:字符串拆分预处理
把输入的逗号分隔日期串按逗号切割,每个片段去除前后空格,过滤空内容后得到日期列表。为了兼容乱序输入的场景,可以把所有日期统一转成可计算日期间隔的格式(比如编程语言内置的日期时间对象)后按升序排序;如果能保证输入日期本身是按升序排列的,可以省略排序步骤。 - 第二步:遍历分组连续日期
初始化分组记录容器,先取第一个日期作为当前连续区间的起始、结束值。从第二个日期开始逐个遍历:- 计算当前日期和当前区间结束日期的间隔,如果间隔刚好为1天,说明日期连续,直接把当前区间的结束值更新为当前日期即可
- 如果间隔大于1天,说明连续关系中断,先把当前记录的区间存入分组容器,再新建一个连续区间,起始、结束值都设为当前遍历到的日期
所有日期遍历完成后,记得把最后一个未存入容器的当前区间追加进去。
- 第三步:按要求格式化输出
按下标从0开始遍历分组好的日期区间:如果区间的起始、结束日期是同一天,直接输出单日期格式;如果起止日期不同,就输出起始日期 - 结束日期的区间格式。
以Python实现为例,可直接运行的参考代码如下:
from datetime import datetime, timedelta def merge_continuous_dates(raw_date_str): # 拆分字符串做预处理 date_items = [item.strip() for item in raw_date_str.split(',') if item.strip()] # 转日期对象并排序,输入确定有序时可去掉sorted date_objs = sorted([datetime.strptime(item, '%Y-%m-%d') for item in date_items]) if not date_objs: return "" # 遍历分组连续日期 date_groups = [] period_start = period_end = date_objs[0] for current_date in date_objs[1:]: if current_date - period_end == timedelta(days=1): period_end = current_date else: date_groups.append((period_start, period_end)) period_start = period_end = current_date # 追加最后一个分组 date_groups.append((period_start, period_end)) # 格式化结果 result_lines = [] for index, (start, end) in enumerate(date_groups): start_fmt = start.strftime('%Y-%m-%d') end_fmt = end.strftime('%Y-%m-%d') if start == end: result_lines.append(f"{index} => {start_fmt}") else: result_lines.append(f"{index} => {start_fmt} - {end_fmt}") return "\n".join(result_lines) # 测试示例输入 input_content = "2022-07-15, 2022-07-16, 2022-07-17, 2022-07-18, 2022-07-22, 2022-07-25, 2022-07-26, 2022-07-27, 2022-07-28" print(merge_continuous_dates(input_content))
运行上述代码,输出结果和需求给出的期望结果完全一致:
0 => 2022-07-15 - 2022-07-18 1 => 2022-07-22 2 => 2022-07-25 - 2022-07-28
注意:不建议直接用字符串拼接数字的方式判断日期间隔,跨月、跨年场景下这种判断逻辑会出错,用语言内置的日期计算能力处理间隔判断最稳妥。
内容的提问来源于stack exchange,提问作者denlau
相关产品推荐
相关产品推荐

