Python中如何基于字符串日期计算9月至次年8月的对应学年
实现方案
完全不需要枚举时间戳区间,也不需要把日期转成Unix时间戳做硬编码比对——这类固定偏移的年度分段规则,直接通过解析后的日期月份、年份做算术计算即可,代码无硬编码、适配任意年份范围,可维护性极强。
核心判断逻辑非常简单:
- 每年9月(含)之后的日期,属于当前公历年开头的学年
- 每年8月(含)之前的日期,属于上一个公历年开头的学年
- 学年标识的结束年份取后两位拼接即可
完整实现代码
from datetime import datetime def give_academic_year(date_str: str) -> str: # 解析输入的字符串格式日期 current_dt = datetime.strptime(date_str, "%d/%m/%Y") # 计算学年起始年份 academic_start = current_dt.year if current_dt.month >= 9 else current_dt.year - 1 academic_end = academic_start + 1 # 拼接为要求的"YYYY-YY"格式 return f"{academic_start}-{str(academic_end)[-2:]}"
边界验证
用几个关键节点测试返回结果,完全符合划分规则:
- 输入
"01/09/2018":月份为9,属于2018年开头的学年,返回"2018-19" - 输入
"31/08/2019":月份为8,属于2018年开头的学年,返回"2018-19" - 输入
"01/01/2000":月份为1,属于1999年开头的学年,返回"1999-00" - 输入
"31/12/2022":月份为12,属于2022年开头的学年,返回"2022-23"
补充说明:你原代码里的时间戳区间逻辑存在错误,把自然年边界和学年边界做了对齐,会导致每年1-8月的日期被归属到错误的学年,上述实现严格遵循「9月1日至次年8月31日」的划分规则。另外转Unix时间戳的写法本身带有时区隐患,不同时区下同个本地日期对应的时间戳存在偏差,直接操作datetime对象的年、月属性完全没有这类问题。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

