Python: 日期与时间
最后更新:2026-09-22
处理日期和时间是编程中最常见的需求之一——记录日志时间、计算借阅天数、统计某段时间的数据……
datetime模块是 Python 处理日期时间的标准方式。
1. 获取当前时间
PYTHON
from datetime import datetime, date, time
# 当前日期时间
now = datetime.now()
print(now) # 2026-06-23 16:00:00.123456
# 当前日期
today = date.today()
print(today) # 2026-06-23
# 创建指定日期
d = datetime(2026, 6, 23, 15, 30, 0)
print(d) # 2026-06-23 15:30:00
▶ 示例:生日提醒(难度⭐)
▶ 试一试输出:
TEXT
📖 仅展示
# 函数定义成功
2. 格式化与解析
PYTHON
from datetime import datetime
# 日期 → 字符串(格式化)
now = datetime.now()
print(now.strftime("%Y-%m-%d")) # 2026-06-23
print(now.strftime("%Y年%m月%d日")) # 2026年06月23日
print(now.strftime("%H:%M:%S")) # 16:00:00
print(now.strftime("%A")) # Tuesday(星期几)
# 字符串 → 日期(解析)
date_str = "2026-06-23 15:30:00"
parsed = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(parsed) # 2026-06-23 15:30:00
| 格式符 | 含义 | 示例 |
|---|---|---|
%Y |
四位年份 | 2026 |
%m |
两位月份 | 06 |
%d |
两位日期 | 23 |
%H |
小时(24时) | 15 |
%M |
分钟 | 30 |
%S |
秒 | 00 |
%A |
星期全名 | Tuesday |
💡
strftime 是"日期→字符串",strptime 是"字符串→日期"。 记不住的话想"f=format, p=parse"——format 是输出,parse 是解析。
3. timedelta:时间差
PYTHON
from datetime import datetime, timedelta
now = datetime.now()
# 计算未来/过去的时间
future = now + timedelta(days=7)
past = now - timedelta(days=30)
print(f"7天后:{future.strftime('%Y-%m-%d')}")
print(f"30天前:{past.strftime('%Y-%m-%d')}")
# 时间计算
print(timedelta(days=7)) # 7 days, 0:00:00
print(timedelta(hours=3, minutes=15)) # 3:15:00
print(timedelta(weeks=2)) # 14 days, 0:00:00
# 两个日期相减
d1 = datetime(2026, 6, 1)
d2 = datetime(2026, 6, 23)
diff = d2 - d1
print(f"相差 {diff.days} 天") # 相差 22 天
▶ 示例:订阅到期提醒(难度⭐⭐)
▶ 试一试输出:
TEXT
📖 仅展示
=== 订阅到期检查 ===
▶ 示例:项目截止日期计算(难度⭐)
▶ 试一试输出:
TEXT
📖 仅展示
=== 项目倒计时 ===
🟢 课程作业:还剩 22 天
🟢 毕业设计:还剩 127 天
🟡 实习报告:仅剩 10 天!
30 天后是:2026年09月09日
4. 常见应用场景
- 日志时间戳:每条日志记录当前时间。
- 过期检查:判断会员/订阅是否过期。
- 日期计算:计算两个日期之间的天数。
- 时间格式化:把时间显示为用户友好的格式。
- 定时任务:在指定时间执行某个操作。
❓ 常见问题
Q
datetime.now() 返回的是本地时间还是 UTC 时间?A 本地时间。如果需要 UTC 时间用
datetime.utcnow()。但注意 utcnow() 返回的是不带时区信息的 naive 时间。生产环境建议用 datetime.now(timezone.utc) 或 pytz / zoneinfo 处理时区。Q
strptime 解析失败会怎样?A 抛出
ValueError——"time data 'xxx' does not match format '%Y-%m-%d'"。用 try-except 包起来处理错误情况。常见的坑:月份和日期必须是两位数(%m 不匹配 "6",需要 "06")。Q
timedelta 最大支持多少天?A 理论上没有上限——
timedelta(days=1000000) 也是合法的。但注意 total_seconds() 可能溢出。日常使用完全不用担心范围问题。📖 小节
datetime.now()获取当前日期时间,date.today()只获取日期strftime()日期→字符串,strptime()字符串→日期- 常用格式:
%Y年、%m月、%d日、%H时、%M分、%S秒 timedelta做日期加减:days、hours、minutes、weeks- 两个
datetime相减得到timedelta,.days属性获取相差天数
📝 作业
-
基础题(难度⭐):输出当前时间的以下格式:
2026年06月23日 星期二、2026-06-23 16:00、06/23/2026。 -
进阶题(难度⭐⭐):写一个函数
workdays_between(start, end),计算两个日期之间有多少个工作日(周一到周五)。提示:用timedelta遍历每一天,用weekday()判断星期几(0=周一,4=周五)。 -
挑战题(难度⭐⭐⭐):写一个"番茄钟"程序。工作 25 分钟 → 休息 5 分钟,循环 4 次后长休息 15 分钟。用
time.sleep()模拟计时,用datetime显示当前阶段和剩余时间。