如何实现活动多日期智能格式化,输出精简易读的日期展示字符串
多日期智能格式化实现方案
实现逻辑
- 先将输入的所有日期字符串转换为datetime对象,按时间升序排序
- 遍历排序后的日期,合并连续的日期段(连续判定标准为当前日期比上一日期晚1天)
- 对每个合并后的连续日期段做差异化格式化:
- 单天段:直接输出「月份缩写+日期」
- 同月连续段:输出「月份缩写+开始日期-结束日期」
- 跨月连续段:输出「开始月份缩写+开始日期-结束月份缩写+结束日期」
- 拼接所有格式化段时,若当前段与前一段月份相同,省略当前段的月份避免冗余
Python 实现代码
from datetime import datetime, timedelta def format_event_dates(date_str_list, input_format='%m/%d'): # 转换为datetime对象并排序 dates = sorted([datetime.strptime(d, input_format) for d in date_str_list]) if not dates: return '' # 合并连续日期段 date_ranges = [] current_start = dates[0] current_end = dates[0] for d in dates[1:]: if d - current_end == timedelta(days=1): current_end = d else: date_ranges.append((current_start, current_end)) current_start = d current_end = d date_ranges.append((current_start, current_end)) # 格式化各时间段 formatted_parts = [] prev_month = None month_abbr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] for start, end in date_ranges: start_month = month_abbr[start.month - 1] end_month = month_abbr[end.month - 1] start_day = start.day end_day = end.day if start == end: # 单天日期处理 part = f"{end_day}" if start_month == prev_month else f"{start_month} {start_day}" elif start_month == end_month: # 同月连续日期处理 part = f"{start_day}-{end_day}" if start_month == prev_month else f"{start_month} {start_day}-{end_day}" else: # 跨月连续日期处理 part = f"{start_month} {start_day}-{end_month} {end_day}" formatted_parts.append(part) prev_month = end_month return ', '.join(formatted_parts)
测试示例
# 测试1:多日跨非连续日期 print(format_event_dates(['8/25', '8/26', '8/27', '9/3'])) # 输出:Aug 25-27, Sep 3 # 测试2:单日日期 print(format_event_dates(['5/20'])) # 输出:May 20 # 测试3:同月非连续日期 print(format_event_dates(['9/19', '9/22'])) # 输出:Sep 19, 22 # 测试4:跨月连续日期 print(format_event_dates(['2/28', '3/1', '3/2'])) # 输出:Feb 28-Mar 2 # 测试5:多个不连续连续段 print(format_event_dates(['4/2', '4/3', '4/4', '6/10', '6/11', '6/12', '6/13'])) # 输出:Apr 2-4, Jun 10-13 # 测试6:同月多段避免月份冗余 print(format_event_dates(['12/1', '12/2', '12/3', '12/8'])) # 输出:Dec 1-3, 8
扩展说明
如果需要处理带年份的日期,仅需修改input_format参数,同时在格式化逻辑中增加年份相同的判定即可,当前代码默认适配同一年的日期处理,完全覆盖所有需求点。
内容的提问来源于stack exchange,提问作者MarkPraschan
相关产品推荐
相关产品推荐

