第 40 课 · 阶段七 · 进阶主题

日期时间与时间戳

时间处理是程序常客。这一课彻底搞懂 datetime 的获取、格式化、运算,以及 time 模块的时间戳。

第 40 课阶段七 · 进阶主题难度:进阶建议时长:30 分钟关键词:datetime · time · 时间戳

🎯 学完本课你将掌握

  • 用 datetime 获取与格式化当前时间
  • 进行日期加减与比较
  • 理解时间戳与时间转换

一、获取当前时间

获取时间.py
1from datetime import datetime, date, time
2
3now = datetime.now()
4print(now) # 2026-09-01 14:30:00.123456
5print(now.date()) # 2026-09-01 只取日期
6print(now.time()) # 14:30:00.123456 只取时间
7print(now.year, now.month, now.day)
8print(now.hour, now.minute, now.second)

二、格式化与解析

格式化.py
1from datetime import datetime
2
3now = datetime.now()
4print(now.strftime("%Y年%m月%d日 %H:%M:%S")) # 2026年09月01日 ...
5print(now.strftime("%A")) # 星期几(英文)
6
7# 字符串 → datetime(解析)
8s = "2026-09-01 08:30:00"
9dt = datetime.strptime(s, "%Y-%m-%d %H:%M:%S")
10print(dt) # 2026-09-01 08:30:00
11print(dt.weekday()) # 0=周一

三、日期加减:timedelta

日期运算.py
1from datetime import datetime, timedelta
2
3now = datetime.now()
4print(now + timedelta(days=7)) # 一周后
5print(now - timedelta(days=1)) # 昨天
6print(now + timedelta(hours=3)) # 三小时后
7print(now + timedelta(weeks=2, days=1))
8
9# 两个日期相减得到时间差
10start = datetime(2026, 9, 1, 9, 0)
11end = datetime(2026, 9, 1, 12, 30)
12diff = end - start
13print(diff) # 3:30:00
14print(diff.total_seconds()) # 12600.0 秒

四、time 模块与时间戳

时间戳是从 1970-01-01 00:00:00(UTC)到现在的秒数,计算机内部常用它表示时间。

时间戳.py
1import time
2
3print(time.time()) # 当前时间戳(浮点秒)
4print(int(time.time())) # 取整
5
6# 时间戳 → 本地时间元组 → 格式化字符串
7ts = time.time()
8lt = time.localtime(ts)
9print(time.strftime("%Y-%m-%d %H:%M:%S", lt))

五、综合案例:学习计时器

计时器.py
1import time
2from datetime import datetime
3
4print("开始学习:", datetime.now().strftime("%H:%M:%S"))
5start = time.time()
6input("学完一节课后按回车结束...")
7end = time.time()
8used = end - start
9print(f"本次学习了 {used:.0f} 秒,约 {used / 60:.1f} 分钟")

六、常见错误与解决

常见错误与解决

错误现象原因 / 解决方法
strptime 解析报错格式符与字符串不匹配:%Y 四位年、%m 两位月、%H 24小时,逐一对齐。
时间格式化出英文星期%A 是英文星期;要中文用列表映射或 f"星期{dt.weekday()+1}"。
时区对不上datetime.now() 是本地时间;想要 UTC 用 datetime.utcnow()。
✍️ 小练习
写程序:输出今天的日期和星期、100 天后是哪天、计算两个生日之间的天数差。
📌 本节小结
datetime 管日期时间:now 获取、strftime 格式化、strptime 解析、timedelta 加减;time.time() 拿时间戳。时间处理三件套,做日志、调度、计时都用得上。