datetime.strptime():将字符串解析成datetime对象 (String Parse Time)。datetime.strftime():将datetime对象格式化成字符串 (String Format Time)。
将字符串转换为 datetime 对象 (strptime)
当你有一个表示日期时间的字符串,并希望对其进行计算、比较或提取特定部分时,就需要先把它转换成 datetime 对象。

基本用法
strptime 需要两个参数:
date_string: 要解析的字符串。format: 描述字符串格式的 格式代码,这个格式代码必须与字符串的格式完全匹配。
常用格式代码:
| 代码 | 含义 | 示例 |
|---|---|---|
%Y |
4位数的年份 | 2025 |
%y |
2位数的年份 | 23 |
%m |
2位数的月份 (01-12) | 09 |
%B |
月份的全名 | September |
%b |
月份的缩写 | Sep |
%d |
2位数的日期 (01-31) | 15 |
%H |
24小时制的小时 (00-23) | 14 |
%I |
12小时制的小时 (01-12) | 02 |
%M |
2位数的分钟 (00-59) | 30 |
%S |
2位数的秒 (00-59) | 05 |
%f |
微秒 (6位数) | 123456 |
%p |
AM 或 PM | PM |
%A |
星期的全名 | Friday |
%a |
星期的缩写 | Fri |
%j |
一年中的第几天 (001-366) | 258 |
%Z |
时区名称 | CST, UTC |
示例
示例 1: 标准格式 "YYYY-MM-DD HH:MM:SS"
from datetime import datetime
date_str = "2025-10-27 10:30:00"
format_code = "%Y-%m-%d %H:%M:%S"
# 将字符串转换为 datetime 对象
dt_object = datetime.strptime(date_str, format_code)
print(f"原始字符串: {date_str}")
print(f"转换后的 datetime 对象: {dt_object}")
print(f"对象类型: {type(dt_object)}")
# 现在可以进行各种操作
print(f"年份: {dt_object.year}")
print(f"月份: {dt_object.month}")
输出:

原始字符串: 2025-10-27 10:30:00
转换后的 datetime 对象: 2025-10-27 10:30:00
对象类型: <class 'datetime.datetime'>
年份: 2025
月份: 10
示例 2: 带有不同分隔符和12小时制的格式
from datetime import datetime
date_str = "27/Oct/2025, 02:30:05 PM"
format_code = "%d/%b/%Y, %I:%M:%S %p"
dt_object = datetime.strptime(date_str, format_code)
print(f"转换后的 datetime 对象: {dt_object}")
输出:
转换后的 datetime 对象: 2025-10-27 14:30:05
示例 3: 处理带微秒和时区的字符串
from datetime import datetime
date_str = "2025-10-27 10:30:00.123456 CST"
format_code = "%Y-%m-%d %H:%M:%S.%f %Z"
dt_object = datetime.strptime(date_str, format_code)
print(f"转换后的 datetime 对象: {dt_object}")
输出:

转换后的 datetime 对象: 2025-10-27 10:30:00.123456
注意: datetime 对象本身不存储时区信息(除非使用 datetime.timezone),这里的 %Z 只是解析了字符串中的时区名称,但不会将其附加到返回的对象上,要处理时区,请使用 pytz 或 Python 3.9+ 的 zoneinfo 模块。
将 datetime 对象转换为字符串 (strftime)
当你有一个 datetime 对象,需要以特定格式将其显示、存储或传输时,就需要使用 strftime。
基本用法
strftime 只需要一个参数:
format: 你希望生成的字符串的格式代码(与strptime中的代码相同)。
示例
示例 1: 转换为 "YYYY年MM月DD日" 格式
from datetime import datetime
# 创建一个 datetime 对象
dt_object = datetime.now()
# 格式化为 "YYYY年MM月DD日 HH时MM分SS秒"
formatted_str = dt_object.strftime("%Y年%m月%d日 %H时%M分%S秒")
print(f"原始 datetime 对象: {dt_object}")
print(f"格式化后的字符串: {formatted_str}")
输出 (取决于当前时间):
原始 datetime 对象: 2025-10-27 15:45:30.123456
格式化后的字符串: 2025年10月27日 15时45分30秒
示例 2: 转换为更友好的可读格式
from datetime import datetime
dt_object = datetime(2025, 10, 27, 14, 30, 0)
# 转换为 "Month Day, Year" 格式
formatted_str_1 = dt_object.strftime("%B %d, %Y")
print(f"格式1: {formatted_str_1}") # 输出: October 27, 2025
# 转换为 "Weekday, Month/Day/Year" 格式
formatted_str_2 = dt_object.strftime("%a, %m/%d/%y")
print(f"格式2: {formatted_str_2}") # 输出: Fri, 10/27/23
常见问题与注意事项
问题1:ValueError: time data does not match format
这是 strptime 最常见的错误,意味着你提供的字符串和格式代码不匹配。
错误示例:
# 字符串是 "2025/10/27",但格式代码是 "%Y-%m-%d" date_str = "2025/10/27" format_code = "%Y-%m-%d" # 错误:分隔符不匹配 # 这行代码会抛出 ValueError dt_object = datetime.strptime(date_str, format_code)
解决方案: 仔细检查字符串和格式代码,确保每个部分(年、月、日、分隔符等)都一一对应。
# 正确的代码 date_str = "2025/10/27" format_code = "%Y/%m/%d" # 正确:使用与字符串相同的分隔符 dt_object = datetime.strptime(date_str, format_code) print(dt_object) # 输出: 2025-10-27 00:00:00
问题2:如何处理非标准或复杂的格式?
如果字符串格式非常多变,或者包含一些难以用格式代码描述的文本,strptime 会变得很困难。
示例: "订单创建于 2025年10月27日 15点45分"
对于这种情况,可以先使用字符串的 replace() 或 split() 方法进行预处理,提取出标准的日期时间部分,然后再用 strptime。
from datetime import datetime
complex_str = "订单创建于 2025年10月27日 15点45分"
# 1. 提取日期时间部分
# 我们可以替换掉中文的 "年月日时分"
date_part = complex_str.replace("年", "-").replace("月", "-").replace("日", "").replace("点", ":").replace("分", "")
# date_part 现在是 "订单创建于 2025-10-27 15:45"
# 2. 使用 split 提取核心字符串
clean_date_str = date_part.split("于 ")[1]
# clean_date_str 现在是 "2025-10-27 15:45"
# 3. 使用 strptime 解析
dt_object = datetime.strptime(clean_date_str, "%Y-%m-%d %H:%M")
print(f"解析后的对象: {dt_object}")
输出:
解析后的对象: 2025-10-27 15:45:00
问题3:datetime 对象 vs time 对象
datetime.datetime:包含日期和时间信息。datetime.time:只包含时间信息(时、分、秒、微秒)。
如果你只想解析一个纯时间字符串(如 "14:30:00"),应该使用 datetime.strptime,然后从返回的 datetime 对象中提取 .time() 部分。
from datetime import datetime
time_str = "14:30:00"
# strptime 返回的是一个 datetime 对象,日期部分默认为 1900-01-01
dt_object = datetime.strptime(time_str, "%H:%M:%S")
print(f"datetime 对象: {dt_object}")
# 从中提取 time 对象
time_object = dt_object.time()
print(f"time 对象: {time_object}")
print(f"对象类型: {type(time_object)}")
输出:
datetime 对象: 1900-01-01 14:30:00
time 对象: 14:30:00
对象类型: <class 'datetime.time'>
| 操作 | 函数 | 输入 | 输出 | 关键 |
|---|---|---|---|---|
| 字符串 -> 对象 | datetime.strptime() |
字符串, 格式代码 | datetime 对象 |
格式代码必须完全匹配 |
| 对象 -> 字符串 | datetime.strftime() |
datetime 对象, 格式代码 |
字符串 | 格式代码定义输出格式 |
掌握 strptime 和 strftime 是处理 Python 中日期时间字符串的关键,记住常用的格式代码,并注意字符串与格式代码的精确匹配,就能轻松应对绝大多数场景。
