Python: 日期与时间
处理日期和时间是编程中最常见的需求之一——记录日志时间、计算借阅天数、统计某段时间的数据……
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
▶ 示例:生日提醒(难度⭐)
PYTHON
from datetime import datetime
def days_to_birthday(birth_str):
"""计算距离生日还有几天"""
today = datetime.now()
birth = datetime.strptime(birth_str, "%m-%d")
birthday_this_year = birth.replace(year=today.year)
if birthday_this_year < today:
birthday_this_year = birthday_this_year.replace(year=today.year + 1)
delta = birthday_this_year - today
return delta.days
print(f"距离下一个生日还有 {days_to_birthday('12-25')} 天")
输出:
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 天
▶ 示例:订阅到期提醒(难度⭐⭐)
PYTHON
from datetime import datetime, timedelta
# 模拟用户订阅信息
subscriptions = [
{"name": "Alice", "expire": "2026-07-15"},
{"name": "Bob", "expire": "2026-06-25"},
{"name": "Charlie", "expire": "2026-08-01"},
{"name": "赵六", "expire": "2026-06-20"},
]
today = datetime.now().strftime("%Y-%m-%d")
today = datetime.strptime(today, "%Y-%m-%d")
print("=== 订阅到期检查 ===")
for sub in subscriptions:
expire = datetime.strptime(sub["expire"], "%Y-%m-%d")
remaining = (expire - today).days
if remaining < 0:
print(f"🔴 {sub['name']}:已过期 {-remaining} 天")
elif remaining <= 7:
print(f"🟡 {sub['name']}:即将到期,还剩 {remaining} 天")
else:
print(f"🟢 {sub['name']}:正常,还剩 {remaining} 天")
输出:
TEXT
📖 仅展示
=== 订阅到期检查 ===
▶ 示例:项目截止日期计算(难度⭐)
PYTHON
from datetime import datetime, timedelta
def countdown(deadline_str):
"""计算距离截止日期还有多少天"""
deadline = datetime.strptime(deadline_str, "%Y-%m-%d")
today = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
diff = (deadline - today).days
return diff
# 模拟多个项目截止日期
projects = [
{"name": "课程作业", "deadline": "2026-09-01"},
{"name": "毕业设计", "deadline": "2026-12-15"},
{"name": "实习报告", "deadline": "2026-08-20"},
]
print("=== 项目倒计时 ===")
for p in projects:
days = countdown(p["deadline"])
if days > 7:
print(f"🟢 {p['name']}:还剩 {days} 天")
elif days > 0:
print(f"🟡 {p['name']}:仅剩 {days} 天!")
elif days == 0:
print(f"🔴 {p['name']}:今天截止!")
else:
print(f"⚫ {p['name']}:已过期 {-days} 天")
# 计算从今天起 30 天后是哪一天
future = datetime.now() + timedelta(days=30)
print(f"\n30 天后是:{future.strftime('%Y年%m月%d日')}")
输出:
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显示当前阶段和剩余时间。