如何不使用额外Python库实现含月份计算的日期时间相加与取整
Python 无第三方库实现非标准月日时分格式时间相加方案
核心难点
- 原生
timedelta不支持月份维度计算,不同月份的天数受年份影响,手动换算易出错 - 输入存在超范围的非标准时间值(例如
%06-%80-%99-%99可直接理解为6个月+80天+99小时+99分钟的增量),需要实现各维度的自动进位取整
实现思路
绕开手动编写进位逻辑的繁琐操作,通过锚定固定基准年的方式,把所有维度的时间增量都转为datetime对象的偏移计算,由Python标准库自动处理所有边界进位:
- 拆分输入字符串为月、日、时、分四个独立的整数值,无需提前校验数值范围
- 单独处理月份累加的年月换算,解决
timedelta不支持月份偏移的问题 - 日、时、分维度的偏移直接交给
timedelta处理,自动完成跨月、24小时转天、60分钟转小时等取整逻辑
实现代码
from datetime import datetime, timedelta def add_mdhm(time_str1: str, time_str2: str, base_year: int = 2024) -> str: # 解析输入字符串,提取月、日、时、分整数 def parse_str(s: str) -> tuple[int, int, int, int]: return tuple(map(int, s.strip("%").split("-"))) m1, d1, h1, mi1 = parse_str(time_str1) m2, d2, h2, mi2 = parse_str(time_str2) # 处理月份累加与年月换算 total_month = m1 + m2 target_year = base_year + (total_month - 1) // 12 target_month = (total_month - 1) % 12 + 1 # 生成月份偏移后的临时基准时间 temp_base = datetime(target_year, target_month, 1, 0, 0) # 累加日、时、分偏移,自动处理所有进位逻辑 result = temp_base + timedelta( days=d1 + d2 - 1, hours=h1 + h2, minutes=mi1 + mi2 ) # 格式化输出为目标格式,自动补前导零 return result.strftime("%m-%d-%H-%M") # 测试示例 if __name__ == "__main__": test_res = add_mdhm("%06-%80-%99-%99", "%07-%17-%20-%12") print(test_res)
注意事项
- 可根据业务需求调整
base_year参数,若需要按闰年计算2月天数,传入对应闰年即可 - 若输入为实际时间而非增量值,只需调整解析逻辑,将输入的月日时分与基准年拼接为完整datetime对象后再做差值计算即可
内容的提问来源于stack exchange,提问作者Ислам Малахов
相关产品推荐
相关产品推荐

