datetime: 最常用、最全面的模块,包含date,time,datetime,timedelta,tzinfo等类。time: 主要处理时间,不涉及日期。calendar: 处理日历相关的功能,比如生成月历、判断是否为闰年等。
下面我们将重点介绍 datetime 模块,因为它在日常开发中使用最频繁。

datetime 模块的核心类
datetime.date
表示一个日期,包含年、月、日。
- 创建:
date(year, month, day) - 获取当前日期:
date.today()
from datetime import date
# 创建一个特定的日期
d = date(2025, 10, 26)
print(d) # 输出: 2025-10-26
# 获取当前日期
today = date.today()
print(f"今天是: {today}") # 输出: 今天是: 2025-10-26 (示例)
# 访问年、月、日
print(f"年份: {d.year}") # 输出: 年份: 2025
print(f"月份: {d.month}") # 输出: 月份: 10
print(f"日期: {d.day}") # 输出: 日期: 26
datetime.time
表示一个时间,包含时、分、秒、微秒。
- 创建:
time(hour, minute, second, microsecond)
from datetime import time
# 创建一个特定的时间
t = time(14, 30, 0, 500000) # 14点30分0秒500毫秒
print(t) # 输出: 14:30:00.500000
# 访问时、分、秒等
print(f"小时: {t.hour}") # 输出: 小时: 14
print(f"分钟: {t.minute}") # 输出: 分钟: 30
print(f"秒: {t.second}") # 输出: 秒: 0
datetime.datetime
这是最常用的类,它结合了 date 和 time 的功能,表示一个具体的日期和时间点。
- 创建:
datetime(year, month, day, hour, minute, second, microsecond) - 获取当前日期和时间:
datetime.now() - 获取当前UTC日期和时间:
datetime.utcnow()
from datetime import datetime
# 创建一个特定的日期和时间
dt = datetime(2025, 10, 26, 10, 30, 0)
print(dt) # 输出: 2025-10-26 10:30:00
# 获取当前的日期和时间
now = datetime.now()
print(f"现在是: {now}") # 输出: 现在是: 2025-10-26 15:45:12.345678 (示例)
# 访问各个组成部分
print(f"年: {now.year}")
print(f"月: {now.month}")
print(f"日: {now.day}")
print(f"时: {now.hour}")
print(f"分: {now.minute}")
字符串与 datetime 对象的相互转换
这是非常常见的操作,比如从数据库或文件中读取日期字符串,或者需要将日期格式化显示给用户。

datetime 对象 -> 字符串 (格式化)
使用 strftime() 方法 (string format time)。
from datetime import datetime
now = datetime.now()
# 格式化为 "YYYY-MM-DD HH:MM:SS"
str_format1 = now.strftime("%Y-%m-%d %H:%M:%S")
print(str_format1) # 输出: 2025-10-26 15:45:12
# 格式化为 "YYYY年MM月DD日"
str_format2 = now.strftime("%Y年%m月%d日")
print(str_format2) # 输出: 2025年10月26日
# 格式化为 "星期X, HH:MM"
str_format3 = now.strftime("%A, %H:%M") # %A是星期几的全名
print(str_format3) # 输出: Thursday, 15:45 (取决于当前是周几)
常用格式化代码:
%Y: 四位数的年份 (e.g., 2025)%m: 两位数的月份 (01-12)%d: 两位数的日 (01-31)%H: 24小时制的小时 (00-23)%I: 12小时制的小时 (01-12)%M: 两位数的分钟 (00-59)%S: 两位数的秒 (00-59)%A: 星期几的全名 (e.g., Monday)%a: 星期几的缩写 (e.g., Mon)%f: 微秒 (6位数字)
字符串 -> datetime 对象 (解析)
使用 strptime() 方法 (string parse time)。
from datetime import datetime
date_string = "2025-10-26 15:45:12"
# 将字符串解析为 datetime 对象
dt_object = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(dt_object) # 输出: 2025-10-26 15:45:12
print(type(dt_object)) # 输出: <class 'datetime.datetime'>
# 注意:格式化代码必须与字符串格式完全匹配
# 错误示例: dt_object = datetime.strptime("26/10/2025", "%Y-%m-%d") # 会报 ValueError
时间差与计算 (timedelta)
timedelta 用于表示两个日期或时间之间的差值,或者用于进行日期的加减运算。

- 创建:
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
from datetime import datetime, timedelta
now = datetime.now()
# 创建一个时间差 (3天4小时)
delta = timedelta(days=3, hours=4)
# 计算未来的某个时间
future_time = now + delta
print(f"3天4小时后是: {future_time}")
# 计算过去的某个时间
past_time = now - delta
print(f"3天4小时前是: {past_time}")
# 计算两个日期之间的差值
date1 = datetime(2025, 1, 1)
date2 = datetime(2025, 10, 26)
difference = date2 - date1
print(f"从 {date1} 到 {date2} 相差: {difference}")
print(f"相差的天数: {difference.days}") # 输出相差的天数
print(f"相差的秒数: {difference.seconds}") # 输出剩余的秒数 (不含天数部分的秒数)
时区处理 (timezone)
处理不同时区的日期时间是现代应用中非常重要的一环,Python 3.2+ 引入了 datetime.timezone 来处理时区。
from datetime import datetime, timezone, timedelta
# 获取当前带时区的 datetime
# 使用 UTC+8 时区 (例如北京时间)
tz_utc_8 = timezone(timedelta(hours=8))
now_with_tz = datetime.now(tz_utc_8)
print(f"北京时间: {now_with_tz}") # 输出: 2025-10-26 23:45:12+08:00
# 使用 UTC 时区
now_utc = datetime.now(timezone.utc)
print(f"UTC时间: {now_utc}") # 输出: 2025-10-26 15:45:12+00:00
# 时区转换 (从一个时区转换到另一个时区)
# 假设我们有一个 UTC 时间
utc_time = datetime(2025, 10, 26, 15, 0, 0, tzinfo=timezone.utc)
# 转换为 UTC+8 时间
beijing_time = utc_time.astimezone(timezone(timedelta(hours=8)))
print(f"UTC时间 {utc_time} 对应的北京时间是: {beijing_time}")
注意:虽然 datetime.timezone 可以处理固定偏移的时区,但对于更复杂的时区(例如夏令时),建议使用第三方库 pytz,它是 Python 时区处理的事实标准。
常用操作总结
| 功能 | 方法/函数 | 示例 |
|---|---|---|
创建 datetime 对象 |
datetime() |
dt = datetime(2025, 10, 26, 10, 30) |
| 获取当前时间 | datetime.now() |
now = datetime.now() |
| 获取当前UTC时间 | datetime.utcnow() |
now_utc = datetime.utcnow() |
| 格式化成字符串 | strftime() |
now.strftime("%Y-%m-%d") |
| 从字符串解析 | strptime() |
dt = datetime.strptime("2025-10-26", "%Y-%m-%d") |
| 时间加减 | 或 timedelta |
future = now + timedelta(days=7) |
| 计算时间差 | delta = date2 - date1 |
|
| 访问年月日时分秒 | .year, .month, ... |
now.year |
| 替换某个部分 | replace() |
new_dt = now.replace(hour=0, minute=0) |
小练习
假设你有一个订单创建时间字符串 "2025-10-26T10:30:00Z" (Z代表UTC时间),请计算这个订单是否已经超过了24小时。
from datetime import datetime, timedelta, timezone
order_time_str = "2025-10-26T10:30:00Z"
# 1. 解析字符串为 datetime 对象
# 注意字符串中的 'T' 和 'Z',以及时区信息
# %Y-%m-%dT%H:%M:%S 是格式
# %z 是时区偏移量,Z 代表 UTC+00:00
order_time = datetime.strptime(order_time_str, "%Y-%m-%dT%H:%M:%S%z")
print(f"订单创建时间: {order_time}")
# 2. 获取当前的 UTC 时间
now_utc = datetime.now(timezone.utc)
print(f"当前 UTC 时间: {now_utc}")
# 3. 计算时间差
time_difference = now_utc - order_time
print(f"时间差: {time_difference}")
# 4. 判断是否超过 24 小时
if time_difference > timedelta(hours=24):
print("订单已超过24小时。")
else:
print("订单未超过24小时。")
希望这个详细的讲解能帮助你完全掌握 Python 中的 datetime 类型!
