如何在Python中实现起止日期验证及月度日期区间生成?
实现月度日期区间生成工具(Python)
功能说明
根据输入的起止日期(格式DD/MM/YYYY,用逗号分隔),生成包含每个月份首尾日期的区间列表,自动处理跨年度、月末边界及日期合法性验证。
完整代码实现
import datetime def get_month_interval_list(start_date_str, end_date_str): # 日期解析格式 date_format = "%d/%m/%Y" try: # 转换为date对象 start_date = datetime.datetime.strptime(start_date_str.strip(), date_format).date() end_date = datetime.datetime.strptime(end_date_str.strip(), date_format).date() except ValueError as e: raise ValueError(f"日期格式错误或日期无效:{e}") if start_date > end_date: raise ValueError("开始日期不能晚于结束日期") interval_list = [] current_month_start = datetime.date(start_date.year, start_date.month, 1) while current_month_start <= end_date: # 计算当前月的结束日期:如果是结束日期所在月,取end_date,否则取当月最后一天 next_month_start = datetime.date(current_month_start.year + current_month_start.month // 12, (current_month_start.month % 12) + 1, 1) current_month_end = next_month_start - datetime.timedelta(days=1) if current_month_end > end_date: current_month_end = end_date # 按指定格式添加到列表(这里用YYYY-MM-DD格式,可按需修改) interval_list.append(f"{current_month_start.strftime('%Y-%m-%d')} 至 {current_month_end.strftime('%Y-%m-%d')}") # 跳到下一个月的第一天 current_month_start = next_month_start return interval_list # 示例使用 if __name__ == "__main__": user_input = input("请输入起止日期(格式:DD/MM/YYYY, DD/MM/YYYY):") try: start_str, end_str = user_input.split(",") intervals = get_month_interval_list(start_str, end_str) print("\n月度日期区间列表:") for idx, interval in enumerate(intervals, 1): print(f"{idx}. {interval}") except ValueError as e: print(f"错误:{e}")
关键逻辑解释
- 日期验证与转换:用
strptime解析输入字符串,捕获格式错误或无效日期(如2月30日),同时检查开始日期是否早于结束日期。 - 月度首尾计算:通过获取下一个月第一天再减一天的方式,无需依赖第三方库,直接用datetime模块实现月末日期计算。
- 循环终止条件:当当前月的第一天超过结束日期时停止循环,确保最后一个区间的结束日期不会超出用户指定的结束日期。
示例运行
输入:02/12/2022, 24/02/2023
输出:
月度日期区间列表:
- 2022-12-01 至 2022-12-31
- 2023-01-01 至 2023-01-31
- 2023-02-01 至 2023-02-24
内容的提问来源于stack exchange,提问作者Joy fernandas
相关产品推荐
相关产品推荐

