一、核心对象四剑客
对象 | 属性 | 关键特性 |
| year, month, day | 纯日期操作 |
| hour, minute, second | 时间处理,可含时区 |
| 包含date+time所有属性 | 最常用,支持算术运算 |
| days, seconds | 表示时间间隔,支持链式计算 |
二、关键操作示例
1. 日期运算与周计算
from datetime import datetime, timedelta
now = datetime.now()
print(f"此刻: {now}") # 2024-08-12 14:30:00
# 计算3天后的日期
future = now + timedelta(days=3)
print(f"三天后: {future.date()}") # 2024-08-15
# 判断本周一日期
monday = now - timedelta(days=now.weekday())
print(f"本周一: {monday.strftime('%Y-%m-%d')}") # 2024-08-12
2. 时间解析与格式化
date_str = "2023-12-25 08:30"
dt_obj = datetime.strptime(date_str, "%Y-%m-%d %H:%M")
print(dt_obj) # 2023-12-25 08:30:00
# 自定义格式输出
print(dt_obj.strftime("日期: %A, %B %d")) # 日期: Monday, December 25
3. 时区关键操作
from datetime import timezone, timedelta
# 创建北京时间(UTC+8)
beijing_tz = timezone(timedelta(hours=8))
local_dt = datetime(2024, 1, 1, 12, tzinfo=beijing_tz)
# 转换为纽约时间(UTC-5)
ny_dt = local_dt.astimezone(timezone(timedelta(hours=-5)))
print(f"北京时间 {local_dt} → 纽约时间 {ny_dt}")
# 输出: 2024-01-01 12:00+08:00 → 2023-12-31 23:00-05:00
4. 时间戳与datetime互转
# 获取当前时间戳(浮点数秒数)
timestamp = datetime.now().timestamp()
print(f"当前时间戳: {timestamp}")
# 时间戳转回datetime(含时区)
from_timestamp = datetime.fromtimestamp(timestamp, tz=timezone.utc)
print(f"UTC时间: {from_timestamp}")
三、避坑指南
- 时区陷阱:
-
- 默认
datetime
不含时区(naive),比较或计算前需统一时区 - 使用
astimezone()
转换而非replace(tzinfo=...)
(后者不调整时间值)
- 默认
- 日期边界:
-
timedelta
支持负数(时间回溯)- 月份增减需用第三方库
dateutil.relativedelta
(避免闰月错误)
最佳实践
# 安全时区转换流程
naive_dt = datetime.now() # 无时区对象
utc_dt = naive_dt.replace(tzinfo=timezone.utc) # 标记为UTC时间
target_dt = utc_dt.astimezone(timezone(timedelta(hours=8))) # 转换到目标时区
通过系统掌握datetime
对象生态与时区机制,可高效解决日志分析、定时任务、国际化系统等场景的时间难题。建议优先使用含时区对象(aware datetime)确保数据一致性。
源码速查:Python官方datetime文档
datetime — Basic date and time types — Python 3.13.6 documentation