datetime 模块是 Python 处理日期和时间的主要工具,其核心功能之一就是格式化(将 datetime 对象转换为字符串)和解析(将字符串转换为 datetime 对象)。

格式化:strftime() 方法
strftime() 的全称是 "String Format Time",意为“字符串格式化时间”,它是一个 datetime 对象的方法,用于将日期和时间信息格式化为指定的字符串。
语法:
datetime_object.strftime(format_code)
format_code 是由各种格式代码组成的字符串,这些代码以 开头。
常用格式代码表
| 代码 | 含义 | 示例 |
|---|---|---|
%Y |
四位数的年份 | 2025 |
%y |
两位数的年份 | 23 |
%m |
两位数的月份 (01-12) | 09 |
%B |
月份的全称 | September |
%b |
月份的简称 | Sep |
%d |
两位数的日期 (01-31) | 07 |
%A |
星期几的全称 | Thursday |
%a |
星期几的简称 | Thu |
%H |
24小时制的小时 (00-23) | 14 |
%I |
12小时制的小时 (01-12) | 02 |
%M |
两位数的分钟 (00-59) | 30 |
%S |
两位数的秒 (00-59) | 05 |
%f |
微秒 (000000-999999) | 123456 |
%p |
本地 A.M. 或 P.M. 的标识 | PM |
%j |
一年中的第几天 (001-366) | 250 |
%U |
一年中的第几周(周日为一周的第一天) | 36 |
%W |
一年中的第几周(周一为一周的第一天) | 36 |
%c |
本地的日期和时间表示 | Thu Sep 7 14:30:05 2025 |
%x |
本地的日期表示 | 09/07/23 |
%X |
本地的时间表示 | 14:30:05 |
| 一个普通的 字符 |
解析:strptime() 方法
strptime() 的全称是 "String Parse Time",意为“字符串解析时间”,它是 datetime 模块中的一个函数,用于根据指定的格式字符串,将日期时间字符串解析为 datetime 对象。

语法:
datetime.strptime(date_string, format_code)
date_string: 要解析的日期时间字符串。format_code: 描述date_string格式的代码,与strftime()中的代码相同。
综合示例
下面是一个完整的例子,展示了如何创建 datetime 对象,以及如何进行格式化和解析。
import datetime
# 1. 创建一个 datetime 对象
# 使用当前时间
now = datetime.datetime.now()
print(f"当前的 datetime 对象: {now}")
# 输出: 当前的 datetime 对象: 2025-09-07 14:30:05.123456
# 使用指定时间创建
specific_date = datetime.datetime(2025, 10, 27, 10, 30, 0)
print(f"指定的 datetime 对象: {specific_date}")
# 输出: 指定的 datetime 对象: 2025-10-27 10:30:00
# 2. 格式化: 使用 strftime()
# 示例 1: 标准格式 "YYYY-MM-DD HH:MM:SS"
formatted_standard = now.strftime("%Y-%m-%d %H:%M:%S")
print(f"标准格式: {formatted_standard}")
# 输出: 标准格式: 2025-09-07 14:30:05
# 示例 2: "YYYY年MM月DD日 HH时MM分SS秒"
formatted_chinese = now.strftime("%Y年%m月%d日 %H时%M分%S秒")
print(f"中文格式: {formatted_chinese}")
# 输出: 中文格式: 2025年09月07日 14时30分05秒
# 示例 3: "YYYY/MM/DD (星期X)"
formatted_weekday = now.strftime("%Y/%m/%d (%a)")
print(f"带星期的格式: {formatted_weekday}")
# 输出: 带星期的格式: 2025/09/07 (Thu)
# 示例 4: "YYYY-MM-DD HH:MM:SS.ffffff"
formatted_with_microseconds = now.strftime("%Y-%m-%d %H:%M:%S.%f")
print(f"带微秒的格式: {formatted_with_microseconds}")
# 输出: 带微秒的格式: 2025-09-07 14:30:05.123456
# 3. 解析: 使用 strptime()
# 假设我们有一个日期时间字符串
date_string = "2025-10-27 15:45:30"
# 使用对应的格式代码来解析它
parsed_datetime = datetime.datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(f"\n原始字符串: '{date_string}'")
print(f"解析后的 datetime 对象: {parsed_datetime}")
print(f"解析后的对象类型: {type(parsed_datetime)}")
# 输出:
# 原始字符串: '2025-10-27 15:45:30'
# 解析后的 datetime 对象: 2025-10-27 15:45:30
# 解析后的对象类型: <class 'datetime.datetime'>
# 另一个例子:解析不同格式的字符串
date_string_2 = "27/Oct/2025, 10:30 AM"
parsed_datetime_2 = datetime.datetime.strptime(date_string_2, "%d/%b/%Y, %I:%M %p")
print(f"\n解析字符串: '{date_string_2}'")
print(f"解析结果: {parsed_datetime_2}")
# 输出:
# 解析字符串: '27/Oct/2025, 10:30 AM'
# 解析结果: 2025-10-27 10:30:00
常见错误与注意事项
-
格式代码不匹配 这是最常见的错误。
strptime()中提供的格式代码必须与字符串的格式完全对应,否则会抛出ValueError。# 错误示例:月份是数字但格式代码用了%B try: # 字符串中月份是 "09",但格式代码 %B 期望 "September" datetime.datetime.strptime("2025-09-07", "%Y-%B-%d") except ValueError as e: print(f"错误: {e}") # 输出: 错: time data '2025-09-07' does not match format '%Y-%B-%d' # 正确示例 correct_date = datetime.datetime.strptime("2025-09-07", "%Y-%m-%d") print(f"正确解析: {correct_date}") # 输出: 正确解析: 2025-09-07 00:00:00 -
时区问题
datetime.datetime对象本身可以是无时区的(naive),也可以是带时区的(aware)。strftime和strptime默认处理的是本地时区或无时区信息。- 如果你的字符串包含时区信息(如
+08:00,UTC,EST),你需要使用pytz或 Python 3.9+ 内置的zoneinfo模块来正确解析。 now.strftime(...)会输出本地时区的时间。
# Python 3.9+ 使用 zoneinfo # from zoneinfo import ZoneInfo # tz = ZoneInfo("Asia/Shanghai") # aware_now = datetime.datetime.now(tz) # print(aware_now.strftime("%Y-%m-%d %H:%M:%S %Z")) # 输出: 2025-09-07 14:30:05 CST - 如果你的字符串包含时区信息(如
-
性能 对于大量的日期时间处理,频繁地调用
strptime可能会成为性能瓶颈,在这种情况下,可以考虑使用第三方库如dateutil.parser,它更灵活,但可能稍慢。# 使用 dateutil.parser (需要安装: pip install python-dateutil) from dateutil import parser # 它能自动识别多种常见格式 date_string_3 = "Oct 27, 2025" date_string_4 = "2025/10/27 10:30" parsed_3 = parser.parse(date_string_3) parsed_4 = parser.parse(date_string_4) print(f"\n使用 dateutil 解析: {date_string_3} -> {parsed_3}") print(f"使用 dateutil 解析: {date_string_4} -> {parsed_4}")
其他相关类
date: 仅处理日期(年、月、日),同样有strftime()和strptime()方法。time: 仅处理时间(时、分、秒、微秒、时区)。timedelta: 表示两个日期或时间之间的差值(时间间隔)。
from datetime import date, time, timedelta
# date 示例
today = date.today()
print(f"\n今天的日期 (date 对象): {today}")
print(f"格式化后的日期: {today.strftime('%Y年%m月%d日')}")
# time 示例
current_time = time(14, 30, 5)
print(f"\n当前的时间 (time 对象): {current_time}")
print(f"格式化后的时间: {current_time.strftime('%H:%M:%S')}")
# timedelta 示例
from datetime import datetime
one_day_later = datetime.now() + timedelta(days=1)
print(f"\n一天后的时间: {one_day_later}")
| 操作 | 方法/函数 | 描述 |
|---|---|---|
| 格式化 | datetime_object.strftime(format) |
将 datetime 对象转换为字符串。 |
| 解析 | datetime.strptime(string, format) |
将字符串转换为 datetime 对象。 |
| 获取当前时间 | datetime.datetime.now() |
获取当前的本地 datetime 对象。 |
| 获取当前日期 | datetime.date.today() |
获取当前的本地 date 对象。 |
strftime 和 strptime 是核心,它们的格式代码是相通的,多练习几次,就能熟练掌握 Python 日期时间的格式化与解析。
