杰瑞科技汇

Python字符串如何转datetime对象?

核心工具是 Python 内置的 datetime 模块,我们主要使用其中的 datetime 类和 strptime / strftime 方法。

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

字符串 转换为 datetime 对象

当你有一个日期时间的字符串("2025-10-27 10:30:00"),并希望它能像真正的日期时间一样进行计算或比较时,就需要将它转换为 datetime 对象。

核心方法:datetime.strptime()

  • strptime 的全称是 "string parse time",意思是“从字符串解析时间”。
  • 它需要两个参数:
    1. date_string: 包含日期时间的字符串。
    2. format_code: 描述字符串格式的代码。这是最关键的一步,Python 需要这个格式代码来正确地解读字符串。

常用格式代码

格式代码 含义 示例
%Y 4位数的年份 2025
%y 2位数的年份 23
%m 2位数的月份 (01-12) 10
%B 月份的全称 October
%b 月份的缩写 Oct
%d 2位数的日期 (01-31) 27
%H 24小时制的小时 (00-23) 22
%I 12小时制的小时 (01-12) 10
%M 分钟 (00-59) 30
%S 秒 (00-59) 05
%f 微秒 (6位数字) 123456
%A 星期几的全称 Friday
%a 星期几的缩写 Fri
%p AM/PM (AM or PM) PM

示例

from datetime import datetime
# 示例1: 标准格式 "YYYY-MM-DD HH:MM:SS"
date_str = "2025-10-27 15:45:30"
format_code = "%Y-%m-%d %H:%M:%S"
dt_object = datetime.strptime(date_str, format_code)
print(f"原始字符串: {date_str}")
print(f"转换后的 datetime 对象: {dt_object}")
print(f"对象的类型: {type(dt_object)}")
print("-" * 20)
# 示例2: 带有秒和微秒的格式
date_str_with_micro = "2025/10/27 09:05:22.123456"
format_code_with_micro = "%Y/%m/%d %H:%M:%S.%f"
dt_object_with_micro = datetime.strptime(date_str_with_micro, format_code_with_micro)
print(f"原始字符串: {date_str_with_micro}")
print(f"转换后的 datetime 对象: {dt_object_with_micro}")
print("-" * 20)
# 示例3: 包含月份全称和AM/PM的格式
date_str_am_pm = "October 27, 2025 03:30:00 PM"
format_code_am_pm = "%B %d, %Y %I:%M:%S %p"
dt_object_am_pm = datetime.strptime(date_str_am_pm, format_code_am_pm)
print(f"原始字符串: {date_str_am_pm}")
print(f"转换后的 datetime 对象: {dt_object_am_pm}")

输出:

原始字符串: 2025-10-27 15:45:30
转换后的 datetime 对象: 2025-10-27 15:45:30
对象的类型: <class 'datetime.datetime'>
--------------------
原始字符串: 2025/10/27 09:05:22.123456
转换后的 datetime 对象: 2025-10-27 09:05:22.123456
--------------------
原始字符串: October 27, 2025 03:30:00 PM
转换后的 datetime 对象: 2025-10-27 15:30:00

datetime 对象 转换为 字符串

当你有一个 datetime 对象,并希望以特定的格式将它显示出来或保存到文件/数据库时,就需要将它转换为字符串。

核心方法:strftime()

  • strftime 的全称是 "string format time",意思是“将时间格式化为字符串”。
  • 它只需要一个参数:
    1. format_code: 你希望输出的字符串格式,这个格式代码和上面 strptime 使用的完全一样。

示例

from datetime import datetime
# 创建一个 datetime 对象
now = datetime.now()
print(f"当前的 datetime 对象: {now}")
print("-" * 20)
# 示例1: 转换为 "YYYY-MM-DD" 格式
format1 = "%Y-%m-%d"
str1 = now.strftime(format1)
print(f"格式 '{format1}': {str1}")
# 示例2: 转换为 "YYYY年MM月DD日 HH时MM分" 格式
format2 = "%Y年%m月%d日 %H时%M分"
str2 = now.strftime(format2)
print(f"格式 '{format2}': {str2}")
# 示例3: 转换为 "Month Day, Year" 格式
format3 = "%B %d, %Y"
str3 = now.strftime(format3)
print(f"格式 '{format3}': {str3}")
# 示例4: 转换为 "HH:MM:SS" 格式
format4 = "%H:%M:%S"
str4 = now.strftime(format4)
print(f"格式 '{format4}': {str4}")

输出 (会根据你运行代码的时间而变化):

Python字符串如何转datetime对象?-图2
(图片来源网络,侵删)
当前的 datetime 对象: 2025-10-27 10:30:00.123456
--------------------
格式 '%Y-%m-%d': 2025-10-27
格式 '%Y年%m月%d日 %H时%M分': 2025年10月27日 10时30分
格式 '%B %d, %Y': October 27, 2025
格式 '%H:%M:%S': 10:30:00

常见错误与注意事项

错误 1: 格式代码与字符串不匹配

这是最常见的错误,如果字符串的格式和提供的格式代码不一致,strptime 会抛出 ValueError

from datetime import datetime
# 字符串是 "2025/10/27",但格式代码是 "%Y-%m-%d"
# 斜杠和横杠不匹配
try:
    datetime.strptime("2025/10/27", "%Y-%m-%d")
except ValueError as e:
    print(f"错误捕获: {e}")
# 正确的做法
correct_dt = datetime.strptime("2025/10/27", "%Y/%m/%d")
print(f"正确转换: {correct_dt}")

输出:

错误捕获: time data '2025/10/27' does not match format '%Y-%m-%d'
正确转换: 2025-10-27 00:00:00

错误 2: 忘记处理微秒

如果字符串中包含微秒,但你的格式代码没有 %f,微秒部分会被忽略,不会报错,但这可能不是你想要的结果。

from datetime import datetime
# 字符串包含微秒 ".123456",但格式代码没有 %f
date_str = "2025-10-27 10:30:00.123456"
format_code = "%Y-%m-%d %H:%M:%S" # 缺少 %f
dt_object = datetime.strptime(date_str, format_code)
print(f"转换结果: {dt_object}") # 微秒部分丢失了

输出:

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

其他实用技巧

从时间戳(timestamp)转换

时间戳是从 1970 年 1 月 1 日 00:00:00 UTC 开始计算的秒数。

from datetime import datetime
import time
# 获取当前时间戳
timestamp = time.time()
print(f"当前时间戳: {timestamp}")
# 将时间戳转换为 datetime 对象 (UTC时间)
dt_from_timestamp = datetime.utcfromtimestamp(timestamp)
print(f"从时间戳转换 (UTC): {dt_from_timestamp}")
# 将 datetime 对象转换回时间戳
new_timestamp = dt_from_timestamp.timestamp()
print(f"转换回时间戳: {new_timestamp}")

处理不同时区

上面的例子都处理的是“天真”(naive)的 datetime 对象,即没有时区信息,在实际应用中,处理时区非常重要。

Python 3.9+ 推荐使用 zoneinfo 模块。

from datetime import datetime
from zoneinfo import ZoneInfo # Python 3.9+
# 创建一个有时区的 datetime 对象
# 纽约时间
ny_time = datetime.now(ZoneInfo("America/New_York"))
print(f"纽约当前时间: {ny_time}")
# 东京时间
tokyo_time = datetime.now(ZoneInfo("Asia/Tokyo"))
print(f"东京当前时间: {tokyo_time}")
# 将一个无时区的对象转换为有时区的对象
naive_dt = datetime(2025, 10, 27, 12, 0)
aware_dt_utc = naive_dt.replace(tzinfo=ZoneInfo("UTC"))
print(f"UTC时间: {aware_dt_utc}")
操作 方法 参数 说明
字符串 -> datetime datetime.strptime() (字符串, 格式代码) 解析字符串,根据格式代码创建 datetime 对象。
datetime -> 字符串 datetime.strftime() (格式代码) 根据 format_code 格式化 datetime 对象为字符串。

strptimeparsing (解析),输入是字符串;strftimeformatting (格式化),输入是 datetime 对象,这个记忆技巧可以帮助你区分这两个方法。

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