核心方法:strftime()
strftime() 方法是 datetime 对象的一个内置方法,它的全称是 "string format time"(字符串格式化时间),它可以将一个 datetime 对象根据指定的格式代码,格式化为一个字符串。

(图片来源网络,侵删)
语法:
datetime_object.strftime(format_code)
datetime_object: 一个datetime对象。format_code: 一个字符串,包含了格式说明符,用来定义输出的格式。
常用格式代码
这是最关键的部分,你需要了解这些代码的含义才能自由组合出你想要的格式。
| 格式代码 | 含义 | 示例 (输出) |
|---|---|---|
%Y |
4位数的年份 | 2025 |
%y |
2位数的年份 | 23 |
%m |
2位数的月份 (01-12) | 09 |
%B |
月份的全称 | September |
%b |
月份的缩写 | Sep |
%d |
2位数的日 (01-31) | 15 |
%A |
星期几的全称 | Friday |
%a |
星期几的缩写 | Fri |
%H |
24小时制的小时数 (00-23) | 14 |
%I |
12小时制的小时数 (01-12) | 02 |
%M |
分钟数 (00-59) | 30 |
%S |
秒数 (00-59) | 05 |
%f |
微秒 (000000-999999) | 123456 |
%p |
AM 或 PM | PM |
%j |
一年中的第几天 (001-366) | 258 |
%U |
一年中的第几周(周日为每周第一天) (00-53) | 37 |
%W |
一年中的第几周(周一为每周第一天) (00-53) | 37 |
%c |
本地化的日期和时间表示 | Fri Sep 15 14:30:05 2025 |
%x |
本地化的日期表示 | 09/15/23 |
%X |
本地化的时间表示 | 14:30:05 |
| 一个字面的 '%' 字符 |
基础示例
让我们从最常用的几个例子开始。
获取标准的 YYYY-MM-DD HH:MM:SS 格式
这是数据库和日志文件中最常见的格式。

(图片来源网络,侵删)
from datetime import datetime
# 1. 创建一个 datetime 对象
now = datetime.now()
# 2. 使用 strftime 进行格式化
formatted_string = now.strftime("%Y-%m-%d %H:%M:%S")
print(f"原始 datetime 对象: {now}")
print(f"格式化后的字符串: {formatted_string}")
# 输出示例 (执行时间不同,结果会变):
# 原始 datetime 对象: 2025-09-15 14:30:05.123456
# 格式化后的字符串: 2025-09-15 14:30:05
获取 YYYY/MM/DD 格式
from datetime import datetime
now = datetime.now()
formatted_string = now.strftime("%Y/%m/%d")
print(formatted_string)
# 输出示例: 2025/09/15
获取 YYYY年MM月DD日 HH时MM分SS秒 格式
中文环境下的常见写法。
from datetime import datetime
now = datetime.now()
formatted_string = now.strftime("%Y年%m月%d日 %H时%M分%S秒")
print(formatted_string)
# 输出示例: 2025年09月15日 14时30分05秒
获取带星期的格式
from datetime import datetime
now = datetime.now()
# 星期几, 月份 日, 年
formatted_string = now.strftime("%A, %B %d, %Y")
print(formatted_string)
# 输出示例: Friday, September 15, 2025
获取 12 小时制带 AM/PM 的格式
from datetime import datetime
now = datetime.now()
# 12小时制: 时:分:秒 AM/PM
formatted_string = now.strftime("%I:%M:%S %p")
print(formatted_string)
# 输出示例: 02:30:05 PM
高级和实用示例
处理时区
如果你的 datetime 对象是时区感知的(timezone-aware),strftime 也能正确处理。
from datetime import datetime, timezone, timedelta
# 创建一个时区感知的 datetime 对象 (UTC+8)
tz = timezone(timedelta(hours=8)) # 东八区
now_aware = datetime.now(tz)
# 格式化时区信息
# %z 时区偏移量 (格式 +HHMM 或 -HHMM)
formatted_string = now_aware.strftime("%Y-%m-%d %H:%M:%S %z")
print(formatted_string)
# 输出示例: 2025-09-15 22:30:05 +0800
处理微秒
如果需要高精度时间,可以使用 %f。
from datetime import datetime
now = datetime.now()
formatted_string = now.strftime("%Y-%m-%d %H:%M:%S.%f")
print(formatted_string)
# 输出示例: 2025-09-15 14:30:05.123456
常见错误与注意事项
ValueError: Invalid format string
这个错误通常发生在你使用了不存在的格式代码,或者大小写写错了。

(图片来源网络,侵删)
# 错误示例
from datetime import datetime
now = datetime.now()
# %Y 是正确的,但 %y 是小写,表示两位年份
# %M 是分钟,%m 是月份,大小写很重要
try:
now.strftime("%Y-%m-%d %H:%M:%S %Y") # 多了一个 %Y 会导致问题
except ValueError as e:
print(f"错误: {e}")
# 正确的写法
# now.strftime("%Y-%m-%d %H:%M:%S")
AttributeError: 'str' object has no attribute 'strftime'
这个错误非常常见,意味着你试图对一个字符串调用 strftime 方法,请确保你操作的是一个 datetime 对象。
from datetime import datetime
# 错误示例
my_date_string = "2025-09-15"
try:
my_date_string.strftime("%Y-%m-%d") # my_date_string 是 str, 不是 datetime
except AttributeError as e:
print(f"错误: {e}")
# 正确的做法是先转换
# my_date_object = datetime.strptime(my_date_string, "%Y-%m-%d")
# my_date_object.strftime(...) # 这样才是对的
反向操作:字符串转 datetime
与 strftime 相对的是 strptime(string parse time),它可以将一个符合特定格式的字符串解析回 datetime 对象。
from datetime import datetime
date_string = "2025-09-15 14:30:05"
# 使用 strptime 将字符串转换为 datetime 对象
# 第一个参数是字符串,第二个参数是字符串的格式
date_object = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(f"原始字符串: {date_string}")
print(f"转换后的 datetime 对象: {date_object}")
print(f"对象的类型: {type(date_object)}")
# 输出:
# 原始字符串: 2025-09-15 14:30:05
# 转换后的 datetime 对象: 2025-09-15 14:30:05
# 对象的类型: <class 'datetime.datetime'>
| 任务 | 方法 | 示例 |
|---|---|---|
datetime → 字符串 |
strftime() |
dt.strftime("%Y-%m-%d") |
字符串 → datetime |
strptime() |
datetime.strptime("2025-09-15", "%Y-%m-%d") |
strftime 的核心是格式化,而 strptime 的核心是解析,熟练掌握格式代码 %Y, %m, %d, %H, %M, %S 是解决绝大多数时间格式化问题的关键。
