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())从文本回到日期
你的练习清单
- 日历日期用 date,带时钟的值用 datetime。
- 时长和差值用 timedelta。
- 存储日期时优先使用 ISO 或数字格式。
- 只有值表示瞬间时才添加时区。
- 让 strptime 和 strftime 的模式保持一致。
常见问题
timedelta 会处理闰年吗?
会。给日期加天数会遵循日历规则,包括闰年。
date 和 datetime 有什么区别?
date 只有年月日。datetime 还包含时间,也可以携带时区信息。
为什么换一台电脑后 strftime 的月份名变了?
月份名和星期名依赖区域设置。数字模式可以避免这种差异。
练习日期
12 道题,覆盖日期创建、timedelta、日期差、格式化和带时区的值。
继续阅读: