strftime()需显式调用才能格式化datetime为可读字符串,否则显示含微秒的默认格式;处理时间戳须先转datetime;中文显示需映射或设locale;strptime()解析字符串,strftime()输出字符串。

用 strftime() 控制日期时间的显示格式
Python 的 datetime 对象本身不直接输出可读字符串,必须调用 strftime() 方法并传入格式化指令。它不是自动生效的,漏掉这步会看到类似 2024-05-22 14:30:45.123456 这种带微秒、不易读的默认表示。
常见格式代码要记牢:%Y 是 4 位年份,%y 是 2 位;%m 是补零月份数字,%B 是英文全称(如 May),%b 是缩写(May);%d 是补零日期,%A 是星期全名,%H:%M:%S 是 24 小时制时分秒。
示例:
from datetime import datetime
now = datetime.now()
print(now.strftime("%Y-%m-%d %H:%M")) # 输出:2024-05-22 14:30
注意:strftime() 只接受 datetime、date、time 实例,不能对字符串或时间戳直接调用。
处理时间戳(timestamp)要先转成 datetime
如果你拿到的是 Unix 时间戳(比如 1716388245),不能直接 strftime() —— 它不是 datetime 类型。得先用 datetime.fromtimestamp() 或 datetime.utcfromtimestamp() 转换。
关键区别:
-
fromtimestamp()按本地时区解释时间戳 -
utcfromtimestamp()按 UTC 解释,再转本地显示可能出错 - 如果原始时间戳本就是 UTC,又想显示为 UTC 时间,应使用
datetime.utcfromtimestamp(ts).replace(tzinfo=timezone.utc)再格式化
错误示范:
ts = 1716388245
# ❌ 错误:int 没有 strftime 方法
# ts.strftime("%Y-%m-%d")
正确做法:
from datetime import datetime
ts = 1716388245
dt = datetime.fromtimestamp(ts) # 本地时区
print(dt.strftime("%Y-%m-%d %H:%M:%S"))
中文环境下的星期和月份显示问题
%A 和 %B 默认输出英文,即使系统 locale 是中文也不会自动变。想输出「星期三」「五月」这类中文,不能依赖 strftime() 原生支持。
可行方案:
- 用字典映射:
{'Jan': '一月', 'Feb': '二月', ...}替换strftime("%b")结果 - 用
locale.setlocale(locale.LC_TIME, 'zh_CN.UTF-8')后再调用strftime(),但跨平台不稳定(Windows 上是'Chinese_China.936') - 更稳妥的做法是用第三方库如
arrow或pendulum,它们内置多语言支持
简单映射示例:
cn_month = {"Jan": "一月", "Feb": "二月", "Mar": "三月"}
s = now.strftime("%b %d, %Y")
for en, cn in cn_month.items():
s = s.replace(en, cn)
print(s) # 如:三月 22, 2024
避免 strptime() 和 strftime() 混用导致的类型错误
新手常把两者搞反:strptime() 是「字符串 → datetime」,strftime() 是「datetime → 字符串」。输错方向会报 AttributeError: 'str' object has no attribute 'strftime' 或 TypeError: strptime() takes 2 positional arguments but 3 were given。
典型错误链:
- 从 API 拿到字符串
"2024-05-22T14:30:00" - 误以为能直接
.strftime()→ 报错 - 应该先
datetime.strptime(s, "%Y-%m-%dT%H:%M:%S")解析 - 再对返回的
datetime实例调用strftime()
记住口诀:**in 是输入(str → datetime),out 是输出(datetime → str)**。
真正容易被忽略的是时区隐含行为——datetime.now() 返回的是“无时区信息”的本地时间,后续做跨时区计算或存储前,最好显式加上 tzinfo,否则 strftime() 输出的字符串看似正常,实际含义模糊。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











