strptime 是 "string parse time" 的缩写,它的作用是将一个格式化的时间字符串解析成一个 datetime 对象。

这个方法有两个核心参数:date_string 和 format。
方法签名
datetime.strptime(date_string, format)
参数详解
date_string (必需)
- 类型:
str - 描述: 这是你想要解析的时间字符串。
- 重要: 这个字符串的格式必须与
format参数中指定的格式完全匹配(包括分隔符、空格、大小写等),如果格式不匹配,ValueError异常就会被抛出。
示例:
"2025-10-27 15:30:00""27/10/2025""October 27, 2025""20251027"
format (必需)
- 类型:
str - 描述: 这是一个格式字符串,用来告诉 Python 如何解释
date_string中的各个部分,它由一系列的格式代码组成。 - 重要: 这是
strptime的核心,也是最容易出错的地方,你需要正确地使用格式代码来匹配你的时间字符串。
常用的格式代码:
| 代码 | 含义 | 示例 (输入字符串) | 示例 (输出) |
|---|---|---|---|
%Y |
4位数的年份 | 2025 |
2025 |
%y |
2位数的年份 (00-99) | 23 |
2025 (假设当前世纪) |
%m |
2位数的月份 (01-12) | 10 |
10 |
%B |
月份的全称 | October |
October |
%b |
月份的缩写 | Oct |
Oct |
%d |
2位数的日期 (01-31) | 27 |
27 |
%H |
24小时制的小时 (00-23) | 15 |
15 |
%I |
12小时制的小时 (01-12) | 03 |
3 |
%M |
2位数的分钟 (00-59) | 30 |
30 |
%S |
2位数的秒 (00-59) | 05 |
5 |
%f |
微秒 (6位数字) | 123456 |
123456 |
%A |
星期几的全称 | Friday |
Friday |
%a |
星期几的缩写 | Fri |
Fri |
%p |
AM/PM 标记 | PM |
PM |
%j |
一年中的第几天 (001-366) | 300 |
300 |
%U |
一年中的第几周 (周日为每周第一天) | 43 |
43 |
%W |
一年中的第几周 (周一为每周第一天) | 43 |
43 |
%c |
本地日期和时间表示 | Fri Oct 27 15:30:00 2025 |
Fri Oct 27 15:30:00 2025 |
%x |
本化日期表示 | 10/27/23 |
10/27/23 |
%X |
本地时间表示 | 15:30:00 |
15:30:00 |
| 一个字面的 '%' 字符 | % |
使用示例
让我们通过一些例子来理解这两个参数是如何协同工作的。

示例 1:标准格式 (ISO 8601)
from datetime import datetime
date_str = "2025-10-27 15:30:00"
# 格式说明:
# %Y: 4位年
# -: 连字符
# %m: 2位月
# %d: 2位日
# %H: 24小时
# %M: 分钟
# %S: 秒
dt_object = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(f"原始字符串: {date_str}")
print(f"解析后的 datetime 对象: {dt_object}")
print(f"对象的类型: {type(dt_object)}")
# 输出:
# 原始字符串: 2025-10-27 15:30:00
# 解析后的 datetime 对象: 2025-10-27 15:30:00
# 对象的类型: <class 'datetime.datetime'>
示例 2:不同格式的字符串
from datetime import datetime
# 字符串 "27/10/2025" 使用斜杠作为分隔符
str1 = "27/10/2025"
dt1 = datetime.strptime(str1, "%d/%m/%Y")
print(f"解析 '{str1}' 得到: {dt1}")
# 字符串 "10-27-23" 使用短年份和不同的分隔符
str2 = "10-27-23"
dt2 = datetime.strptime(str2, "%m-%d-%y")
print(f"解析 '{str2}' 得到: {dt2}")
# 字符串 "October 27, 2025" 使用月份全称
str3 = "October 27, 2025"
dt3 = datetime.strptime(str3, "%B %d, %Y")
print(f"解析 '{str3}' 得到: {dt3}")
# 字符串 "03:30 PM" 使用12小时制和AM/PM
str4 = "03:30 PM"
dt4 = datetime.strptime(str4, "%I:%M %p")
print(f"解析 '{str4}' 得到: {dt4}")
# 输出:
# 解析 '27/10/2025' 得到: 2025-10-27 00:00:00
# 解析 '10-27-23' 得到: 2025-10-27 00:00:00
# 解析 'October 27, 2025' 得到: 2025-10-27 00:00:00
# 解析 '03:30 PM' 得到: 1900-01-01 15:30:00 (注意:没有提供年月日,默认为1900-01-01)
示例 3:格式不匹配会引发错误
这是最常见的错误。format 和 date_string 的结构不一致,就会抛出 ValueError。
from datetime import datetime
date_str = "2025/10-27" # 混合使用了斜杠和连字符
# 错误的 format,因为它假设所有分隔符都是连字符
try:
datetime.strptime(date_str, "%Y-%m-%d")
except ValueError as e:
print(f"捕获到错误: {e}")
# 正确的 format
correct_dt = datetime.strptime(date_str, "%Y/%m-%d")
print(f"正确解析 '{date_str}' 得到: {correct_dt}")
# 输出:
# 捕获到错误: time data '2025/10-27' does not match format '%Y-%m-%d'
# 正确解析 '2025/10-27' 得到: 2025-10-27 00:00:00
strptime vs strftime (一个重要的区别)
初学者经常混淆这两个方法,它们是互逆的操作:
| 方法 | 全称 | 作用 | 参数 |
|---|---|---|---|
strptime |
string parse time | 字符串 -> datetime 对象 | (date_string, format) |
strftime |
string format time | datetime 对象 -> 字符串 | (format) |
strftime 示例:
from datetime import datetime
# 创建一个 datetime 对象
now = datetime.now()
# 将 datetime 对象格式化为字符串
# 注意:strftime 只有一个 format 参数
str_now = now.strftime("%Y年%m月%d日 %H时%M分%S秒")
print(f"原始 datetime 对象: {now}")
print(f"格式化后的字符串: {str_now}")
# 输出 (示例):
# 原始 datetime 对象: 2025-10-27 15:45:30.123456
# 格式化后的字符串: 2025年10月27日 15时45分30秒
最佳实践和注意事项
-
格式匹配是关键:花时间确保你的
format字符串与date_string的每一个字符(包括空格和标点)都对应上。
(图片来源网络,侵删) -
处理不同格式:如果需要处理多种可能的时间格式,可以使用
try-except块来尝试多种format。from datetime import datetime date_str = "2025-10-27" formats_to_try = ["%Y-%m-%d", "%m/%d/%Y", "%d-%m-%Y"] for fmt in formats_to_try: try: dt = datetime.strptime(date_str, fmt) print(f"成功使用格式 '{fmt}' 解析: {dt}") break except ValueError: print(f"格式 '{fmt}' 不匹配。") else: print("所有尝试的格式都失败了。") -
性能考虑:
strptime的解析过程相对较慢,如果你需要在一个循环中解析大量相同格式的字符串,考虑先编译格式字符串,虽然 Python 标准库没有直接提供compile方法,但你可以缓存datetime.strptime的结果或者使用更快的第三方库(如dateutil的parser.parse)。 -
时区问题:
strptime默认返回的是本地时区的naive(无时区信息)datetime对象,如果你的时间字符串包含时区信息(如+08:00或UTC),你需要使用更高级的工具(如pytz或 Python 3.9+ 的zoneinfo模块)来正确处理时区。
希望这份详细的解释能帮助你完全理解 Python strptime 的参数!
