Python算法竞赛:datetime核心模板+日期时间秒杀技巧一站式整理
·
在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~7,1=周一,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%的人都踩过)
timedelta无年月参数:不要写timedelta(years=1),会报错!- 星期方法别混用:只记
isoweekday(),7=周日,1=周一; - 时间格式别错:24小时制用
%H,不要用%I(12小时制); - 单位分清:时间戳题目看清是秒还是毫秒(真题1是毫秒)。
总结
datetime模块是Python算法竞赛日期时间类题目的唯一解,核心就4点:
- 导入
datetime和timedelta; - 用
datetime()创建时间对象,取属性/判断星期; - 用
timedelta()做时间加减; - 用
strftime/strptime做格式转换。
吃透这些知识点,竞赛中所有日期、时间、星期、时间戳题目,直接秒杀!
更多推荐


所有评论(0)