杰瑞科技汇

Python datetime 字符串如何互转?

  1. datetime.strptime()将字符串解析成 datetime 对象 (String Parse Time)。
  2. datetime.strftime()datetime 对象格式化成字符串 (String Format Time)。

将字符串转换为 datetime 对象 (strptime)

当你有一个表示日期时间的字符串,并希望对其进行计算、比较或提取特定部分时,就需要先把它转换成 datetime 对象。

Python datetime 字符串如何互转?-图1
(图片来源网络,侵删)

基本用法

strptime 需要两个参数:

  1. date_string: 要解析的字符串。
  2. 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}")

输出:

Python datetime 字符串如何互转?-图2
(图片来源网络,侵删)
原始字符串: 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}")

输出:

Python datetime 字符串如何互转?-图3
(图片来源网络,侵删)
转换后的 datetime 对象: 2025-10-27 10:30:00.123456

注意: datetime 对象本身不存储时区信息(除非使用 datetime.timezone),这里的 %Z 只是解析了字符串中的时区名称,但不会将其附加到返回的对象上,要处理时区,请使用 pytz 或 Python 3.9+ 的 zoneinfo 模块。


datetime 对象转换为字符串 (strftime)

当你有一个 datetime 对象,需要以特定格式将其显示、存储或传输时,就需要使用 strftime

基本用法

strftime 只需要一个参数:

  1. 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 对象, 格式代码 字符串 格式代码定义输出格式

掌握 strptimestrftime 是处理 Python 中日期时间字符串的关键,记住常用的格式代码,并注意字符串与格式代码的精确匹配,就能轻松应对绝大多数场景。

分享:
扫描分享到社交APP
上一篇
下一篇