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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:18:48