You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现活动多日期智能格式化,输出精简易读的日期展示字符串

多日期智能格式化实现方案

实现逻辑

  • 先将输入的所有日期字符串转换为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:45:03