专项练习 · 9 分钟阅读

Python datetime 练习:日期、时间差与格式化

日期看起来简单,直到月份长度、闰年和时区出现。datetime 模块会替你处理日历规则。真正的关键是选对对象:日期、时长,还是某个具体瞬间。

创建并查看日期

date 会校验年、月、日。isoformat 生成稳定、可排序的 YYYY-MM-DD 字符串。需要分别使用年月日时,访问 year、month 和 day 属性。

from datetime import date
start = date(2026, 1, 15)
print(start.isoformat())
print(start.year, start.month, start.day)

经过校验的日历日期

加上一段时长

timedelta 保存的是一段时长,不是日期。把它加到日期上会返回新日期,并正确处理跨月和跨年。两个日期相减得到 timedelta,days 属性给出相差天数。

from datetime import date, timedelta
start = date(2026, 1, 30)
end = start + timedelta(days=3)
print(end.isoformat())
print((end - start).days)

日期运算

用稳定的模式格式化

strftime 把日期变成文本。%Y/%m/%d 这类数字模式在不同区域设置下都可预测。月份名和星期名会随机器语言变化,不要把它们放进存储数据。

from datetime import date
day = date(2026, 10, 27)
print(day.strftime("%Y/%m/%d"))
print(day.isoformat())

数字格式化

区分日期与瞬间

date 回答的是哪一天,带时区的 datetime 回答的是哪一个瞬间。当值表示不同地区共同观察的时刻时,才添加 tzinfo。不要为了让日期看起来完整而硬塞一个时区。

from datetime import datetime, timezone
moment = datetime(2026, 1, 1, 12, 0, tzinfo=timezone.utc)
print(moment.isoformat())

带时区的瞬间

格式明确时才解析文本

strptime 按显式模式把文本变成 datetime。把同一个模式集中放在一处,写入和读取就不会悄悄漂移。面对用户输入的日期,要处理解析错误,不要假设文本一定合法。

from datetime import datetime
day = datetime.strptime("2026-10-27", "%Y-%m-%d")
print(day.date().isoformat())

从文本回到日期

你的练习清单

常见问题

timedelta 会处理闰年吗?

会。给日期加天数会遵循日历规则,包括闰年。

date 和 datetime 有什么区别?

date 只有年月日。datetime 还包含时间,也可以携带时区信息。

为什么换一台电脑后 strftime 的月份名变了?

月份名和星期名依赖区域设置。数字模式可以避免这种差异。

练习日期

12 道题,覆盖日期创建、timedelta、日期差、格式化和带时区的值。

打开练习

继续阅读: