Python datetime对象与字符串怎么互转
在Python开发中,datetime对象与字符串的相互转换主要依赖标准库的 datetime 模块:通过 strftime() 将结构化时间格式化为可读字符串(Format),通过 strptime() 将外部文本解析为日期时间对象(Parse)。本文将从双向转换的执行路径、格式符映射、标准ISO解析及实战陷阱四个维度进行完整梳理。
一、datetime对象转字符串:使用 strftime()
当我们需要将时间写入日志文件、返回给前端API接口或保存到文本数据库时,必须将内存中的 datetime 对象转换为标准格式的字符串。调用的方法是对象的实例方法 strftime()(这里的字母 f 代表 Format,即格式化)。
1. 基本使用示例
以下示例展示了获取当前时间并将其格式化为常见日期时间格式的过程:
from datetime import datetime
# 获取当前时间(datetime对象)
now = datetime.now()
print("原始对象:", type(now), now)
# 1. 转换为最常用的年月日 时分秒格式
str_standard = now.strftime("%Y-%m-%d %H:%M:%S")
print("标准格式化字符串:", str_standard)
# 2. 转换为带中文标签的格式
str_custom = now.strftime("%Y年%m月%d日 %H时%M分")
print("中文日期字符串:", str_custom)
# 3. 仅保留日期
str_date = now.strftime("%Y/%m/%d")
print("斜杠分隔日期:", str_date)
示例输出:
原始对象: <class 'datetime.datetime'> 2026-10-23 08:30:15.123456
标准格式化字符串: 2026-10-23 08:30:15
中文日期字符串: 2026年10月23日 08时30分
斜杠分隔日期: 2026/10/23
二、字符串转datetime对象:使用 strptime()
当程序从文件读取记录、获取用户表单提交或解析网络爬虫数据时,时间通常是以文本形式存在的。此时需要调用 datetime.strptime() 类方法(字母 p 代表 Parse,即语法解析)。
1. 基本使用示例
调用 strptime(date_string, format) 时,第二个参数必须精确匹配第一个参数的排列规则:
from datetime import datetime
# 原始时间字符串
raw_str = "2026-10-23 15:45:30"
date_format = "%Y-%m-%d %H:%M:%S"
# 将字符串解析为datetime对象
dt_obj = datetime.strptime(raw_str, date_format)
print("解析结果:", dt_obj)
print("类型验证:", type(dt_obj))
print(f"年份: {dt_obj.year}, 月份: {dt_obj.month}, 小时: {dt_obj.hour}")
示例输出:
解析结果: 2026-10-23 15:45:30
类型验证: <class 'datetime.datetime'>
年份: 2026, 月份: 10, 小时: 15
2. 常见格式符快速对照表
不管是 strftime 还是 strptime,格式占位符都遵循相同的规则。最常用的格式占位符如下:
| 占位符 | 含义 | 有效取值范围 / 示例 |
|---|---|---|
%Y |
四位数完整年份 | 2024, 2026 |
%y |
两位数年份(无世纪) | 24, 26 |
%m |
十进制两位月份(前导零) | 01 - 12 |
%d |
十进制两位日期(前导零) | 01 - 31 |
%H |
24小时制小时(前导零) | 00 - 23 |
%I |
12小时制小时(前导零) | 01 - 12 |
%M |
分钟(前导零) | 00 - 59 |
%S |
秒数(前导零) | 00 - 59 |
%f |
微秒(6位十进制数) | 000000 - 999999 |
%z |
UTC偏移量 | +0800, -0500 |
三、进阶:ISO 8601标准格式的便捷转换
在现代Web开发和前后端数据交互中,ISO 8601格式(如 2026-10-23T08:30:00+08:00)已成为事实上的工业标准。为了简化格式编写,Python 3.7+ 提供了更加高效直观的方法:
1. datetime 转 ISO 字符串:isoformat()
from datetime import datetime, timezone, timedelta
# 构建一个带有时区信息的对象(东八区)
tz_bj = timezone(timedelta(hours=8))
dt = datetime(2026, 10, 23, 8, 30, 0, tzinfo=tz_bj)
# 直接调用 isoformat()
iso_str = dt.isoformat()
print("ISO 8601 字符串:", iso_str)
输出: 2026-10-23T08:30:00+08:00
2. ISO 字符串转 datetime:fromisoformat()
不需要显式拼写 "%Y-%m-%dT%H:%M:%S%z",直接调用 fromisoformat() 即可快速解析符合ISO标准的字符串:
from datetime import datetime
raw_iso = "2026-10-23T08:30:00+08:00"
parsed_dt = datetime.fromisoformat(raw_iso)
print("解析出的对象:", parsed_dt)
print("时区偏移量:", parsed_dt.tzinfo)
四、容易出现的错误与排查注意点
在进行日期与字符串转换时,初学者常常因为以下细节导致程序抛出异常:
-
ValueError: time data does not match format:这是最常见的错误。原因是字符串的内容、分隔符或空格与格式模板不完全一致。例如文本中带有秒而格式串中漏掉了
:%S,或者月份使用了非补零格式。 -
大小写占位符混淆:例如
%m表示月份(01-12),而%M表示分钟(00-59);%H表示24小时制,而%I表示12小时制。 -
天真时间(Naive)与感知时间(Aware):直接使用
datetime.now()得到的是没有时区信息的 Naive 时间,转换为带时区的字符串(如%z)会输出空字符串;处理跨时区业务时,建议显式附加timezone。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









