datetime 模块中的主要类
在进行转化之前,先了解几个核心类:

datetime.datetime: 这是最常用的类,它包含日期(年、月、日)和时间(时、分、秒、微秒)信息。datetime.date: 只包含日期信息(年、月、日)。datetime.time: 只包含时间信息(时、分、秒、微秒)。datetime.timedelta: 表示时间间隔,用于日期时间的加减运算。datetime.tzinfo: 时区信息的抽象基类。
字符串 与 datetime 对象的相互转化
这是最常见的转化需求,通常用于处理从文件、数据库或API获取的日期时间数据。
a. 字符串 转 datetime 对象
使用 datetime.strptime() 方法("string parse time"),你需要提供一个格式字符串来告诉 Python 你的日期字符串是如何组织的。
格式化代码:
%Y: 四位数的年份 (e.g., 2025)%m: 两位数的月份 (01-12)%d: 两位数的日期 (01-31)%H: 24小时制的小时 (00-23)%M: 分钟 (00-59)%S: 秒 (00-59)%f: 微秒 (6位数字)
示例代码:

from datetime import datetime
# 字符串
date_str = "2025-10-27 15:30:00"
format_str = "%Y-%m-%d %H:%M:%S"
# 转化
dt_object = datetime.strptime(date_str, format_str)
print(f"原始字符串: {date_str}")
print(f"转化后的 datetime 对象: {dt_object}")
print(f"对象类型: {type(dt_object)}")
# 其他格式的例子
date_str_2 = "27/10/23"
dt_object_2 = datetime.strptime(date_str_2, "%d/%m/%y") # %y 是两位数的年份
print(f"\n转化后的对象: {dt_object_2}")
dateutil 库的替代方案:
如果日期字符串的格式不固定或者比较复杂,strptime 会很麻烦,这时可以使用第三方库 python-dateutil,它能自动解析多种格式。
首先安装:pip install python-dateutil
from dateutil import parser
# 自动解析各种格式的字符串
dt_auto_1 = parser.parse("2025-10-27 15:30:00")
dt_auto_2 = parser.parse("27-Oct-2025")
dt_auto_3 = parser.parse("10/27/23 3:30 PM") # 甚至能处理 AM/PM
print(dt_auto_1)
print(dt_auto_2)
print(dt_auto_3)
b. datetime 对象 转 字符串
使用 datetime.strftime() 方法("string format time"),你需要提供一个格式字符串来定义输出的格式。
示例代码:

from datetime import datetime
# 创建一个 datetime 对象
now = datetime.now()
# 转化为不同格式的字符串
# 格式1: YYYY-MM-DD HH:MM:SS
str_format_1 = now.strftime("%Y-%m-%d %H:%M:%S")
print(f"格式1: {str_format_1}")
# 格式2: YYYY年MM月DD日
str_format_2 = now.strftime("%Y年%m月%d日")
print(f"格式2: {str_format_2}")
# 格式3: MM/DD/YYYY
str_format_3 = now.strftime("%m/%d/%Y")
print(f"格式3: {str_format_3}")
# 格式4: 月份名, 日, 年 (e.g., Oct 27, 2025)
str_format_4 = now.strftime("%b %d, %Y")
print(f"格式4: {str_format_4}")
datetime 对象 与 date/time 对象的转化
datetime 对象可以方便地提取出其日期或时间部分。
a. datetime 转 date
直接访问 .date() 属性。
from datetime import datetime
dt = datetime(2025, 10, 27, 10, 30, 0)
# 从 datetime 对象中提取 date 对象
d = dt.date()
print(f"原始 datetime 对象: {dt}")
print(f"提取的 date 对象: {d}")
print(f"对象类型: {type(d)}")
b. datetime 转 time
直接访问 .time() 属性。
from datetime import datetime
dt = datetime(2025, 10, 27, 10, 30, 0)
# 从 datetime 对象中提取 time 对象
t = dt.time()
print(f"原始 datetime 对象: {dt}")
print(f"提取的 time 对象: {t}")
print(f"对象类型: {type(t)}")
时间戳 与 datetime 对象的转化
时间戳(Timestamp)是指从1970年1月1日00:00:00 UTC(纪元)开始经过的秒数。
a. 时间戳 转 datetime 对象
使用 datetime.fromtimestamp()。
from datetime import datetime
import time
# 获取当前时间戳
timestamp = time.time()
print(f"当前时间戳: {timestamp}")
# 将时间戳转化为 datetime 对象
# 默认是本地时区
dt_from_timestamp = datetime.fromtimestamp(timestamp)
print(f"本地时区的 datetime 对象: {dt_from_timestamp}")
# 转化为 UTC 时区的 datetime 对象
dt_utc_from_timestamp = datetime.utcfromtimestamp(timestamp)
print(f"UTC 时区的 datetime 对象: {dt_utc_from_timestamp}")
b. datetime 对象 转 时间戳
使用 datetime.timestamp() 方法(Python 3.3+ 推荐)。
from datetime import datetime
# 创建一个 datetime 对象 (默认是本地时区)
dt = datetime(2025, 10, 27, 10, 30, 0)
print(f"原始 datetime 对象: {dt}")
# 转化为时间戳
timestamp = dt.timestamp()
print(f"转化后的时间戳: {timestamp}")
# 如果是 UTC 时间,需要先指定时区再转换
from datetime import timezone, timedelta
# 创建一个 UTC 时区的 datetime 对象
dt_utc = datetime(2025, 10, 27, 10, 30, 0, tzinfo=timezone.utc)
print(f"\nUTC datetime 对象: {dt_utc}")
# 转化为时间戳
timestamp_utc = dt_utc.timestamp()
print(f"UTC datetime 的时间戳: {timestamp_utc}")
时区处理
处理时区是现代应用开发的关键,Python 3.2+ 内置了对时区的良好支持。
a. 为 datetime 对象添加/修改时区
注意:一个“天真”(naive)的 datetime 对象(没有时区信息)和一个“感知”(aware)的 datetime 对象(有时区信息)不能直接混合使用。
from datetime import datetime, timezone, timedelta
# 1. 创建一个“天真”的 datetime 对象 (无时区)
naive_dt = datetime(2025, 10, 27, 15, 30)
print(f"天真 datetime 对象: {naive_dt}")
# 2. 为它添加时区信息 (变为“感知”对象)
# 方法一: 使用 UTC 时区
aware_dt_utc = naive_dt.replace(tzinfo=timezone.utc)
print(f"感知 UTC datetime 对象: {aware_dt_utc}")
# 方法二: 使用自定义时区 ( UTC+8)
tz_eastern = timezone(timedelta(hours=8)) # 东八区
aware_dt_eastern = naive_dt.replace(tzinfo=tz_eastern)
print(f"感知东八区 datetime 对象: {aware_dt_eastern}")
b. 在不同时区之间转换
使用 astimezone() 方法。
from datetime import datetime, timezone, timedelta
# 假设我们有一个 UTC 时间
utc_time = datetime(2025, 10, 27, 8, 0, tzinfo=timezone.utc)
print(f"UTC 时间: {utc_time}")
# 转换为纽约时区 (UTC-5, 夏令时可能不同,这里简化处理)
tz_ny = timezone(timedelta(hours=-5))
ny_time = utc_time.astimezone(tz_ny)
print(f"纽约时间: {ny_time}")
# 转换为东京时区 (UTC+9)
tz_tokyo = timezone(timedelta(hours=9))
tokyo_time = utc_time.astimezone(tz_tokyo)
print(f"东京时间: {tokyo_time}")
其他常见转化
a. datetime 对象 与 timedelta (时间差) 之间的运算
timedelta 用于表示时间差,可以和 datetime 对象进行加减运算。
from datetime import datetime, timedelta
now = datetime.now()
# 计算未来3天后的时间
future_time = now + timedelta(days=3)
print(f"3天后: {future_time}")
# 计算2小时30分钟前的时间
past_time = now - timedelta(hours=2, minutes=30)
print(f"2小时30分钟前: {past_time}")
# 计算两个 datetime 对象之间的时间差
time_difference = future_time - now
print(f"时间差: {time_difference}")
print(f"时间差的天数: {time_difference.days}")
print(f"时间差的秒数: {time_difference.seconds}")
总结表格
| 转化目标 | 方法/函数 | 示例 |
|---|---|---|
字符串 -> datetime |
datetime.strptime(str, format) |
datetime.strptime("2025-10-27", "%Y-%m-%d") |
datetime -> 字符串 |
dt_object.strftime(format) |
now.strftime("%Y/%m/%d") |
datetime -> date |
dt_object.date() |
dt.date() |
datetime -> time |
dt_object.time() |
dt.time() |
时间戳 -> datetime |
datetime.fromtimestamp(ts) |
datetime.fromtimestamp(1698376200) |
datetime -> 时间戳 |
dt_object.timestamp() |
dt.timestamp() |
| 添加时区 | dt_object.replace(tzinfo=...) |
dt.replace(tzinfo=timezone.utc) |
| 转换时区 | dt_object.astimezone(new_tz) |
utc_time.astimezone(timezone(timedelta(hours=8))) |
| 加减时间差 | dt_object +/- timedelta(...) |
now + timedelta(days=1) |
希望这份详细的梳理能帮助你完全掌握 Python datetime 的转化!
