下面我将从基础到进阶,为你详细讲解各种用法和场景。

核心方法:strftime()
strftime() 方法可以将 datetime 对象格式化为一个字符串,它的名字来源于 "String Format Time"。
语法:
datetime_object.strftime(format_code)
datetime_object: 你想要转换的datetime对象。format_code: 一个格式字符串,由各种格式代码组成,用来定义输出字符串的样式。
常用格式代码
你需要记住一些关键的格式代码,它们就像模板中的占位符:
| 代码 | 含义 | 示例 (假设现在是 2025-10-27 15:30:45) |
|---|---|---|
%Y |
4位数的年份 | 2025 |
%y |
2位数的年份 | 23 |
%m |
2位数的月份 (01-12) | 10 |
%B |
月份的完整名称 | October |
%b |
月份的缩写 | Oct |
%d |
2位数的日 (01-31) | 27 |
%A |
星期的完整名称 | Friday |
%a |
星期的缩写 | Fri |
%H |
24小时制的小时 (00-23) | 15 |
%I |
12小时制的小时 (01-12) | 03 |
%M |
2位数的分钟 (00-59) | 30 |
%S |
2位数的秒 (00-59) | 45 |
%f |
6位数的微秒 (000000-999999) | 123456 |
%p |
AM 或 PM | PM |
%j |
一年中的第几天 (001-366) | 300 |
%U |
一年中的第几周 (周日为每周第一天) | 43 |
%W |
一年中的第几周 (周一为每周第一天) | 43 |
%c |
本地日期和时间的标准表示 | Fri Oct 27 15:30:45 2025 |
%x |
本地的日期表示 | 10/27/23 |
%X |
本地的时间表示 | 15:30:45 |
| 一个普通的 字符 |
基础示例
让我们从几个最常用的例子开始。

转换为标准格式(ISO 8601)
ISO 8601 是一种国际通用的日期时间格式,YYYY-MM-DDTHH:MM:SS,非常适合用于日志、数据交换等。
import datetime
# 1. 创建一个 datetime 对象
now = datetime.datetime.now()
print(f"原始 datetime 对象: {now}")
# 输出: 原始 datetime 对象: 2025-10-27 15:30:45.123456
# 2. 使用 strftime 转换为 ISO 格式的字符串
iso_string = now.strftime("%Y-%m-%dT%H:%M:%S")
print(f"ISO 格式字符串: {iso_string}")
# 输出: ISO 格式字符串: 2025-10-27T15:30:45
# 如果想包含微秒
iso_string_with_microseconds = now.strftime("%Y-%m-%dT%H:%M:%S.%f")
print(f"带微秒的 ISO 字符串: {iso_string_with_microseconds}")
# 输出: 带微秒的 ISO 字符串: 2025-10-27T15:30:45.123456
转换为易读的中文格式
如果你想生成一个像“2025年10月27日 15点30分”这样的中文字符串,可以这样做:
import datetime
now = datetime.datetime.now()
# 组合不同的格式代码
chinese_string = now.strftime("%Y年%m月%d日 %H点%M分%S秒")
print(f"中文格式字符串: {chinese_string}")
# 输出: 中文格式字符串: 2025年10月27日 15点30分45秒
只获取日期部分或时间部分
import datetime
now = datetime.datetime.now()
# 只获取日期
date_string = now.strftime("%Y-%m-%d")
print(f"日期字符串: {date_string}")
# 输出: 日期字符串: 2025-10-27
# 只获取时间
time_string = now.strftime("%H:%M:%S")
print(f"时间字符串: {time_string}")
# 输出: 时间字符串: 15:30:45
# 12小时制时间,带 AM/PM
time_string_12h = now.strftime("%I:%M:%S %p")
print(f"12小时制时间字符串: {time_string_12h}")
# 输出: 12小时制时间字符串: 03:30:45 PM
常见问题与注意事项
时区问题
strftime() 本身不处理时区转换,它只是将 datetime 对象中已有的时间信息按照指定的格式进行格式化。
- 对于无时区的
naivedatetime:strftime会直接格式化其表示的本地时间。 - 对于有时区的
awaredatetime:strftime会格式化其 UTC 时间(如果时区设置为 UTC)或该时区对应的时间。
import datetime
# 1. 无时区的 datetime
naive_dt = datetime.datetime(2025, 10, 27, 12, 0, 0)
print(f"无时区对象: {naive_dt.strftime('%Y-%m-%d %H:%M:%S %Z')}")
# 输出: 无时区对象: 2025-10-27 12:00:00
# 2. 有时区的 datetime (UTC)
utc_dt = datetime.datetime(2025, 10, 27, 12, 0, 0, tzinfo=datetime.timezone.utc)
print(f"UTC时区对象: {utc_dt.strftime('%Y-%m-%d %H:%M:%S %Z')}")
# 输出: UTC时区对象: 2025-10-27 12:00:00 UTC
# 3. 有时区的 datetime (东八区)
tz = datetime.timezone(datetime.timedelta(hours=8)) # 创建东八区时区对象
east8_dt = datetime.datetime(2025, 10, 27, 12, 0, 0, tzinfo=tz)
print(f"东八区对象: {east8_dt.strftime('%Y-%m-%d %H:%M:%S %Z')}")
# 输出: 东八区对象: 2025-10-27 12:00:00 +0800
注意:%Z 会输出时区名称或缩写,对于自定义时区偏移(如 +0800),通常需要手动组合 %z。

ValueError: Invalid format string
如果你在 format_code 中写错了格式代码(比如把 %Y 写成了 %y 而你又想要4位数年份),程序不会报错,只会输出不符合预期的结果,但如果你使用了完全无效的代码(%k),Python 会抛出 ValueError。
import datetime
now = datetime.datetime.now()
# 正确用法
print(now.strftime("%Y-%m-%d")) # 输出: 2025-10-27
# 错误用法 - 会引发 ValueError
try:
print(now.strftime("%k-%m-%d"))
except ValueError as e:
print(f"错误: {e}")
# 输出: 错: Invalid format string
反向操作:字符串转 datetime
如果你有一个符合某种格式的日期时间字符串,想把它变回 datetime 对象,可以使用 datetime.strptime() 方法("String Parse Time")。
import datetime
# 字符串
date_string = "2025-10-27 15:30:45"
# 定义格式
format_code = "%Y-%m-%d %H:%M:%S"
# 使用 strptime 进行转换
dt_object = datetime.datetime.strptime(date_string, format_code)
print(f"转换后的 datetime 对象: {dt_object}")
print(f"对象的类型: {type(dt_object)}")
# 输出:
# 转换后的 datetime 对象: 2025-10-27 15:30:45
# 对象的类型: <class 'datetime.datetime'>
| 操作 | 方法 | 描述 |
|---|---|---|
datetime → str |
datetime_obj.strftime(format_code) |
将 datetime 对象格式化为字符串,非常灵活。 |
str → datetime |
datetime.datetime.strptime(str, format_code) |
将特定格式的字符串解析为 datetime 对象。 |
datetime → ISO str |
datetime_obj.isoformat() |
一个便捷方法,用于生成标准的 ISO 8601 格式字符串。 |
strftime 的核心是格式化,而 strptime 的核心是解析,掌握常用的格式代码,你就能应对绝大多数日期时间字符串转换的需求。
