在Python算法竞赛中,日期、时间、时间差、星期判断类题目是高频考点,如果手动计算闰年、月份天数、时间换算,不仅代码繁琐还极易出错。而Python内置的 datetime 模块是解决这类问题的终极神器,一行代码就能秒杀手动计算的复杂逻辑。

本文结合蓝桥杯Python组国赛真题,整理datetime模块竞赛必学核心知识点、通用模板、避坑指南,吃透这篇,竞赛所有日期时间题直接乱杀!

一、模块基础导入

算法竞赛中只需要导入两个核心类,这是所有代码的开头

# 唯一需要记的导入语句
from datetime import datetime, timedelta
  • datetime:处理具体日期/时间对象(如2025-01-01、12:00:00)
  • timedelta:处理时间间隔/时间偏移(如1天、3毫秒、2小时)

二、核心类1:datetime

1. 初始化(创建时间对象)

语法:datetime(年, 月, 日, 时=0, 分=0, 秒=0, 毫秒=0)

  • 竞赛高频用法:仅传年、月、日(默认时分秒为0);Unix时间戳起点固定为datetime(1970, 1, 1)
# 基础用法:创建指定日期
dt1 = datetime(2025, 1, 1)    # 2025-01-01 00:00:00
# 真题专用:Unix时间戳起始时间
dt2 = datetime(1970, 1, 1)   # 1970-01-01 00:00:00

2. 核心属性(直接取值)

无需计算,直接获取对象的年月日时分秒:

dt = datetime(2025, 10, 1, 12, 30, 45)
print(dt.year)    # 年:2025
print(dt.month)   # 月:10
print(dt.day)     # 日:1
print(dt.hour)    # 时:12
print(dt.minute)  # 分:30
print(dt.second)  # 秒:45

3. 星期判断

isoweekday() → 竞赛唯一推荐!

  • 返回值:1~71=周一7=周日(和日常表述完全一致)
  • 避坑:weekday()返回0~6(0=周一),极易混淆,竞赛不用
dt = datetime(2025, 10, 1)
print(dt.isoweekday())  # 返回数字,7=周日,1=周一

三、核心类2:timedelta

作用:表示时间差,用于datetime对象的加减运算(计算过去/未来的时间)。

1. 竞赛必记初始化参数

⚠️ 重点timedelta 没有年、月参数(年月天数不固定),只记以下参数:

参数 含义 真题场景
days 日期加减
hours 小时 时间偏移
minutes 分钟 时间计算
seconds 通用时间差
milliseconds 毫秒 时间戳转换
# 1毫秒间隔
delta_ms = timedelta(milliseconds=1)
# 1天间隔
delta_day = timedelta(days=1)

2. 核心用法:datetime ± timedelta

时间对象 + 时间间隔 = 新的时间对象(竞赛核心逻辑)

dt = datetime(1970, 1, 1)
dt += timedelta(milliseconds=1000)  # 加1000毫秒(1秒)
print(dt)  # 1970-01-01 00:00:01

四、格式化转换(输入输出必备)

竞赛中需要在时间对象字符串之间互转,两个方法死记硬背:

1. strftime:时间对象 → 字符串(格式化输出)

语法:时间对象.strftime(格式符)
竞赛必记格式符

  • %H:24小时制小时(00~23)
  • %M:分钟(00~59)
  • %S:秒(00~59)
  • %Y:4位年份,%m:2位月份,%d:2位日期
dt = datetime(1970, 1, 1, 12, 30, 45)
print(dt.strftime("%H:%M:%S"))  # 输出:12:30:45(真题1格式)
print(dt.strftime("%Y-%m-%d"))  # 输出:1970-01-01

2. strptime:字符串 → 时间对象(解析输入)

语法:datetime.strptime(字符串, 格式符)
适用场景:输入日期字符串(如2025-01-01),转成对象处理

# 解析字符串为时间对象
dt = datetime.strptime("2025-10-01", "%Y-%m-%d")

五、国赛真题实战

结合两道经典蓝桥杯国赛真题,直接套用模板!

真题1:2021第十二届Python大学A组F 时间显示

题目:输入从1970-1-1 00:00:00开始的毫秒数n,输出格式为HH:MM:SS的时间。
秒杀代码

from datetime import datetime, timedelta

n = int(input())
# 初始化时间戳起点
dt = datetime(1970, 1, 1)
# 定义1毫秒的时间间隔
delta = timedelta(milliseconds=1)
# 累加n毫秒,得到目标时间
dt += n * delta
# 格式化输出时分秒
print(dt.strftime('%H:%M:%S'))

真题2:2012第三届国赛 星期几

题目:统计1949年~2012年,每年10月1日是星期日的年份数量。
秒杀代码

from datetime import datetime

ans = 0
# 遍历所有年份
for year in range(1949, 2013):
    # 创建当年10月1日的时间对象
    dt = datetime(year, 10, 1)
    # isoweekday()==7 代表周日
    if dt.isoweekday() == 7:
        ans += 1
print(ans)

六、竞赛通用速记模板(直接复制)

模板1:毫秒时间戳转时分秒

from datetime import datetime, timedelta
n = int(input())
dt = datetime(1970,1,1) + timedelta(milliseconds=n)
print(dt.strftime("%H:%M:%S"))

模板2:判断指定日期是星期几

from datetime import datetime
dt = datetime(2025,10,1)
print(dt.isoweekday())  # 1=周一,7=周日

模板3:日期加减N天

from datetime import datetime, timedelta
dt = datetime(2025,1,1)
dt += timedelta(days=7)  # 加7天
print(dt.strftime("%Y-%m-%d"))

七、竞赛避坑指南(90%的人都踩过)

  1. timedelta无年月参数:不要写timedelta(years=1),会报错!
  2. 星期方法别混用:只记isoweekday(),7=周日,1=周一;
  3. 时间格式别错:24小时制用%H,不要用%I(12小时制);
  4. 单位分清:时间戳题目看清是还是毫秒(真题1是毫秒)。

总结

datetime模块是Python算法竞赛日期时间类题目的唯一解,核心就4点:

  1. 导入datetimetimedelta
  2. datetime()创建时间对象,取属性/判断星期;
  3. timedelta()做时间加减;
  4. strftime/strptime做格式转换。

吃透这些知识点,竞赛中所有日期、时间、星期、时间戳题目,直接秒杀!

更多推荐