datetime 模块 vs. datetime 类
要分清两个概念:

datetime模块:这是 Python 标准库中的一个模块,它包含了处理日期和时间的各种类和函数,你可以通过import datetime来导入它。datetime类:这是datetime模块中最核心、最常用的一个类,它同时包含了日期(年、月、日)和时间(时、分、秒、微秒)信息。
我们使用 from datetime import datetime 来直接导入 datetime 类,这样写起来更方便。
创建 datetime 对象
创建 datetime 对象主要有两种方式。
使用 datetime() 构造函数
你可以直接传入年、月、日、时、分、秒、微秒等参数来创建一个具体的 datetime 对象。
from datetime import datetime # 创建一个 datetime 对象 # 格式: datetime(年, 月, 日, 时, 分, 秒, 微秒) dt = datetime(2025, 10, 26, 10, 30, 0, 500000) print(dt) # 输出: 2025-10-26 10:30:00.500000 # 如果不提供时间部分,默认为 00:00:00 dt_date_only = datetime(2025, 10, 26) print(dt_date_only) # 输出: 2025-10-26 00:00:00
从字符串解析(最常用)
当你从文件、数据库或用户输入中获取日期时间字符串时,需要将其解析为 datetime 对象才能进行操作,这需要用到 strptime() 方法(parse time 的缩写)。

from datetime import datetime
# 定义一个日期时间字符串
date_string = "2025-10-26 15:45:30"
# 使用 strptime 解析字符串
# 第一个参数是字符串,第二个参数是格式化代码
dt_from_string = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(dt_from_string)
# 输出: 2025-10-26 15:45:30
# 其他格式的例子
dt_iso = datetime.fromisoformat("20251026T154530") # ISO 8601 格式
print(dt_iso)
# 输出: 2025-10-26 15:45:30
获取当前时间
使用 datetime.now() 可以获取当前的本地时间,使用 datetime.utcnow() 可以获取当前的 UTC(协调世界时)时间。
from datetime import datetime
# 获取当前本地时间
now = datetime.now()
print(f"当前本地时间: {now}")
# 输出可能为: 当前本地时间: 2025-10-27 10:05:22.123456
# 获取当前 UTC 时间
now_utc = datetime.utcnow()
print(f"当前 UTC 时间: {now_utc}")
# 输出可能为: 当前 UTC 时间: 2025-10-27 02:05:22.123456 (根据时区不同)
datetime 对象的属性
一旦你有了 datetime 对象,就可以轻松访问它的各个组成部分。
from datetime import datetime
dt = datetime(2025, 10, 26, 15, 45, 30, 123456)
print(f"年份: {dt.year}")
print(f"月份: {dt.month}")
print(f"日期: {dt.day}")
print(f"小时: {dt.hour}")
print(f"分钟: {dt.minute}")
print(f"秒: {dt.second}")
print(f"微秒: {dt.microsecond}")
print(f"星期几 (0是周一, 6是周日): {dt.weekday()}") # 注意:weekday() 返回 0-6
print(f"星期几 (1是周一, 7是周日): {dt.isoweekday()}") # isoweekday() 返回 1-7
print(f"ISO 8601 格式的年份和周数: {dt.isocalendar()}") # 返回一个元组 (year, week, weekday)
格式化输出(strftime)
strftime (format time) 方法可以将 datetime 对象格式化为你想要的字符串。
from datetime import datetime
dt = datetime(2025, 10, 26, 15, 45, 30)
# 常用格式化代码
# %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., Thursday)
# %a: 星期缩写 (e.g., Thu)
# %B: 月份全名 (e.g., October)
# %b: 月份缩写 (e.g., Oct)
# 格式化为常见的字符串
formatted_date_1 = dt.strftime("%Y-%m-%d %H:%M:%S")
print(formatted_date_1)
# 输出: 2025-10-26 15:45:30
formatted_date_2 = dt.strftime("%Y年%m月%d日 %A")
print(formatted_date_2)
# 输出: 2025年10月26日 Thursday
datetime 对象的运算
datetime 对象支持与 timedelta 对象的加减运算,这是进行时间计算的关键。
timedelta 类
timedelta 表示一个时间差或持续时间,你可以创建代表天、秒、毫秒、微秒、分钟、小时、周的 timedelta 对象。
from datetime import datetime, timedelta
now = datetime.now()
# 创建一个时间差对象
# timedelta(天, 秒, 微秒, 毫秒, 分钟, 小时, 周)
delta = timedelta(days=5, hours=3, minutes=30)
# 计算 5天3小时30分钟后的时间
future_time = now + delta
print(f"未来时间: {future_time}")
# 计算 10天前的时间
past_time = now - timedelta(weeks=2)
print(f"过去时间: {past_time}")
# 两个 datetime 对象相减,得到一个 timedelta 对象
time_diff = future_time - past_time
print(f"时间差: {time_diff}")
print(f"时间差的天数: {time_diff.days}")
print(f"时间差的秒数: {time_diff.seconds}") # 注意:只返回剩余部分的秒数,不包括整天对应的秒数
与时间戳的转换
时间戳(Timestamp)是指从 1970年1月1日 00:00:00 UTC(称为“纪元”)开始经过的总秒数。
from datetime import datetime
# 获取当前时间戳
timestamp = datetime.now().timestamp()
print(f"当前时间戳: {timestamp}")
# 将时间戳转换为 datetime 对象
# datetime.fromtimestamp() 返回本地时间
dt_from_timestamp = datetime.fromtimestamp(timestamp)
print(f"从时间戳转换来的本地时间: {dt_from_timestamp}")
# 使用 utcfromtimestamp() 获取 UTC 时间
dt_utc_from_timestamp = datetime.utcfromtimestamp(timestamp)
print(f"从时间戳转换来的 UTC 时间: {dt_utc_from_timestamp}")
时区处理(重要)
datetime 模块本身不包含时区信息的对象,但 datetime 模块提供了一个名为 timezone 的类来处理时区,更常用的是第三方库 pytz 或 Python 3.9+ 内置的 zoneinfo。
使用 datetime.timezone (简单时区)
from datetime import datetime, timezone, timedelta
# 创建一个带有时区的 datetime 对象
# 使用 timezone(timedelta(hours=...)) 来创建一个固定的时区偏移
tz_utc_plus_8 = timezone(timedelta(hours=8)) # 北京时间 (UTC+8)
# 为当前时间指定时区
now_with_tz = datetime.now(tz_utc_plus_8)
print(f"带有时区的当前时间: {now_with_tz}")
# 输出可能为: 2025-10-27 18:05:22.123456+08:00
使用 zoneinfo (Python 3.9+ 推荐方式)
zoneinfo 是 Python 3.9 引入的官方时区库,使用 IANA 时区数据库(如 "Asia/Shanghai", "America/New_York"),比 pytz 更现代化。
# 需要 Python 3.9+
from datetime import datetime
from zoneinfo import ZoneInfo
# 创建一个带有时区的 datetime 对象
tz_sh = ZoneInfo("Asia/Shanghai") # 上海时区 (UTC+8)
tz_ny = ZoneInfo("America/New_York") # 纽约时区 (UTC-4 或 UTC-5)
now_sh = datetime.now(tz_sh)
print(f"上海当前时间: {now_sh}")
now_ny = datetime.now(tz_ny)
print(f"纽约当前时间: {now_ny}")
# 时区转换
# 将上海时间转换为纽约时间
ny_time_from_sh = now_sh.astimezone(tz_ny)
print(f"上海时间转换到纽约时区: {ny_time_from_sh}")
总结表格
| 功能 | 方法/函数 | 描述 | 示例 |
|---|---|---|---|
| 创建对象 | datetime(年, 月, 日, ...) |
直接构造一个 datetime 对象。 |
datetime(2025, 10, 26) |
datetime.strptime(s, fmt) |
从字符串解析 datetime 对象。 |
datetime.strptime("2025-10-26", "%Y-%m-%d") |
|
datetime.now() |
获取当前本地时间的 datetime 对象。 |
datetime.now() |
|
| 访问属性 | .year, .month, .day 等 |
获取 datetime 对象的年、月、日等属性。 |
dt.year |
| 格式化输出 | strftime(fmt) |
将 datetime 对象格式化为字符串。 |
dt.strftime("%Y-%m-%d") |
| 时间计算 | 或 timedelta |
与 timedelta 对象进行加减运算。 |
now + timedelta(days=1) |
| 时间戳转换 | .timestamp() |
将 datetime 对象转换为时间戳。 |
dt.timestamp() |
datetime.fromtimestamp(ts) |
将时间戳转换为 datetime 对象(本地时间)。 |
datetime.fromtimestamp(1698370000) |
|
| 时区处理 | datetime.now(tz=ZoneInfo(...)) |
获取带有时区的当前时间。 | datetime.now(tz=ZoneInfo("Asia/Shanghai")) |
.astimezone(tz) |
将 datetime 对象转换到指定时区。 |
dt.astimezone(ZoneInfo("UTC")) |
希望这份详细的讲解能帮助你完全掌握 Python 的 datetime 类型!
