跨月周拆分需求:将跨月周日起始周拆分为当月与下月子区间
拆分跨月周日起始周的日期区间
原始输入数据
01-05-2022 to 07-05-2022 08-05-2022 to 14-05-2022 15-05-2022 to 21-05-2022 22-05-2022 to 28-05-2022 29-05-2022 to 04-06-2022 and so on....
期望输出数据
01-05-2022 to 07-05-2022 08-05-2022 to 14-05-2022 15-05-2022 to 21-05-2022 22-05-2022 to 28-05-2022 29-05-2022 to 31-05-2022 01-06-2022 to 04-06-2022 05-06-2022 to 11-06-2022 and so on....
核心处理规则
- 周的起始日为周日
- 非跨月的周区间直接保留原格式
- 跨月的周区间拆分为两段:
- 周起始日至当月最后一天
- 下月第一天至原周结束日
- 拆分完成后,后续周区间按周日起始的规则正常生成
通用处理逻辑(伪代码)
遍历每个输入的日期区间 [start_date, end_date]: 若 start_date 与 end_date 同属一个月份: 将该区间直接加入结果列表 否则: 获取 start_date 所在月份的最后一天 last_day 生成第一段区间: start_date → last_day 生成第二段区间: 下月1号 → end_date 将两段区间依次加入结果列表 若为拆分后的后续周,按周日起始规则生成标准周区间并加入结果
Python 实现示例
借助datetime和calendar模块可快速实现该逻辑:
from datetime import datetime, timedelta from calendar import monthrange def split_cross_month_weeks(input_ranges): result = [] date_format = "%d-%m-%Y" for line in input_ranges: line = line.strip() if line == "and so on....": result.append(line) continue start_str, end_str = line.split(" to ") start_date = datetime.strptime(start_str, date_format) end_date = datetime.strptime(end_str, date_format) # 判断是否跨月 if start_date.month == end_date.month: result.append(line) else: # 生成当月内的区间段 last_day_num = monthrange(start_date.year, start_date.month)[1] last_day_date = datetime(start_date.year, start_date.month, last_day_num) result.append(f"{start_date.strftime(date_format)} to {last_day_date.strftime(date_format)}") # 生成下月的区间段 next_month_first = datetime(start_date.year, start_date.month + 1, 1) result.append(f"{next_month_first.strftime(date_format)} to {end_date.strftime(date_format)}") # 生成下一个完整周的区间(示例) # 计算下周日的日期:weekday()返回0=周一,6=周日,所以用6 - weekday()补天数 next_week_start = next_month_first + timedelta(days=(6 - next_month_first.weekday())) next_week_end = next_week_start + timedelta(days=6) result.append(f"{next_week_start.strftime(date_format)} to {next_week_end.strftime(date_format)}") return "\n".join(result) # 测试输入 input_data = [ "01-05-2022 to 07-05-2022", "08-05-2022 to 14-05-2022", "15-05-2022 to 21-05-2022", "22-05-2022 to 28-05-2022", "29-05-2022 to 04-06-2022", "and so on...." ] print(split_cross_month_weeks(input_data))
运行代码后输出将与期望格式完全匹配。
内容的提问来源于stack exchange,提问作者Priyal Jain
相关产品推荐
相关产品推荐

