pin_drop当前位置:知识文库 ❯ 图文
Python strftime详解 - 日期时间格式化输出完全指南
目录
一、strftime 概述
strftime(String Format Time)是 Python datetime 模块中将日期时间对象格式化为字符串的方法。它通过格式化指令(以 % 开头的特殊字符)控制输出的格式,支持灵活地定制日期时间的显示方式。
strftime 是将内部日期时间数据转换为用户可读文本的标准方法,广泛应用于日志格式化、报表生成、文件命名和界面显示等场景。
二、strftime 语法与格式化指令
代码示例
from datetime import datetime, date, time
# datetime对象格式化
dt.strftime(format)
# date对象格式化
d.strftime(format)
# time对象格式化
t.strftime(format)
常用格式化指令
三、常用格式化模板示例
以下示例展示了多种常用的日期时间格式化模板,覆盖日常开发中的大部分场景:
代码示例
from datetime import datetime
now = datetime(2024, 1, 15, 14, 30, 0)
# 常用格式
formats = {
"ISO日期": "%Y-%m-%d",
"ISO时间": "%H:%M:%S",
"ISO日期时间": "%Y-%m-%d %H:%M:%S",
"中文日期": "%Y年%m月%d日",
"中文日期时间": "%Y年%m月%d日 %H时%M分%S秒",
"12小时制": "%Y-%m-%d %I:%M:%S %p",
"美式格式": "%m/%d/%Y",
"欧式格式": "%d/%m/%Y",
"文件名安全": "%Y%m%d_%H%M%S",
"星期信息": "%A, %B %d, %Y",
}
print("常用格式化模板:")
print("-" * 50)
for name, fmt in formats.items():
result = now.strftime(fmt)
print(f" {name:12s} | {fmt:30s} -> {result}")
输出:
代码示例
常用格式化模板:
--------------------------------------------------
ISO日期 | %Y-%m-%d -> 2024-01-15
ISO时间 | %H:%M:%S -> 14:30:00
ISO日期时间 | %Y-%m-%d %H:%M:%S -> 2024-01-15 14:30:00
中文日期 | %Y年%m月%d日 -> 2024年01月15日
中文日期时间 | %Y年%m月%d日 %H时%M分%S秒 -> 2024年01月15日 14时30分00秒
12小时制 | %Y-%m-%d %I:%M:%S %p -> 2024-01-15 02:30:00 PM
美式格式 | %m/%d/%Y -> 01/15/2024
欧式格式 | %d/%m/%Y -> 15/01/2024
文件名安全 | %Y%m%d_%H%M%S -> 20240115_143000
星期信息 | %A, %B %d, %Y -> Monday, January 15, 2024
四、date 与 time 对象的格式化
strftime 不仅可以用于 datetime 对象,还可以用于 date 和 time 对象:
代码示例
from datetime import date, time
# date对象格式化
d = date(2024, 6, 15)
print("date格式化:")
print(f" 默认: {d}")
print(f" 格式化: {d.strftime('%Y年%m月%d日')}")
print(f" 星期: {d.strftime('%A')}")
print(f" 年内天数: {d.strftime('%j')}")
# time对象格式化
t = time(14, 30, 45)
print("\ntime格式化:")
print(f" 默认: {t}")
print(f" 格式化: {t.strftime('%H:%M:%S')}")
print(f" 12小时制: {t.strftime('%I:%M:%S %p')}")
输出:
代码示例
date格式化:
默认: 2024-06-15
格式化: 2024年06月15日
星期: Saturday
年内天数: 167
time格式化:
默认: 14:30:45
格式化: 14:30:45
12小时制: 02:30:45 PM
注意:
%f(微秒)仅在 datetime 和 time 对象上有效,date 对象不支持 %f。
五、实战:日志格式化工具
以下是一个综合运用 strftime 的实战项目,演示如何在日志系统中使用不同的时间格式:
代码示例
from datetime import datetime
class LogFormatter:
"""日志格式化工具"""
# 预定义格式
FORMATS = {
"simple": "%(time)s [%(level)s] %(msg)s",
"detailed": "%(time)s [%(level)s] %(file)s:%(line)s - %(msg)s",
"json": '{"time":"%(time)s","level":"%(level)s","msg":"%(msg)s"}',
}
TIME_FORMATS = {
"iso": "%Y-%m-%dT%H:%M:%S",
"compact": "%Y%m%d%H%M%S",
"readable": "%Y-%m-%d %H:%M:%S",
"verbose": "%A, %B %d, %Y %I:%M:%S %p",
}
@classmethod
def format_time(cls, dt=None, style="iso"):
"""格式化时间"""
if dt is None:
dt = datetime.now()
fmt = cls.TIME_FORMATS.get(style, cls.TIME_FORMATS["iso"])
return dt.strftime(fmt)
@classmethod
def format_log(cls, level, message, time_style="iso", log_style="simple"):
"""格式化日志条目"""
time_str = cls.format_time(style=time_style)
log_fmt = cls.FORMATS.get(log_style, cls.FORMATS["simple"])
return log_fmt % {
"time": time_str,
"level": level,
"msg": message,
"file": "app.py",
"line": "42",
}
# 测试
dt = datetime(2024, 1, 15, 14, 30, 0)
print("时间格式化:")
for style in ["iso", "compact", "readable", "verbose"]:
print(f" {style:10s}: {LogFormatter.format_time(dt, style)}")
print("\n日志格式化:")
for style in ["simple", "detailed", "json"]:
log = LogFormatter.format_log("INFO", "用户登录成功", time_style="iso", log_style=style)
print(f" {style}: {log}")
输出:
代码示例
时间格式化:
iso : 2024-01-15T14:30:00
compact : 20240115143000
readable : 2024-01-15 14:30:00
verbose : Monday, January 15, 2024 02:30:00 PM
日志格式化:
simple: 2024-01-15T14:30:00 [INFO] 用户登录成功
detailed: 2024-01-15T14:30:00 [INFO] app.py:42 - 用户登录成功
json: {"time":"2024-01-15T14:30:00","level":"INFO","msg":"用户登录成功"}
六、实际应用场景
-
日志格式化:为日志条目添加统一的时间戳格式,便于日志分析和检索
-
报表生成:将日期时间格式化为用户友好的显示格式,如"2024年1月15日"
-
文件命名:使用时间戳生成唯一的文件名,如
backup_20240115_143000.zip
七、注意事项与常见陷阱
陷阱1:平台差异:strftime 的格式化指令在不同平台上的支持可能略有差异,特别是 %Z(时区名称)在某些平台上可能返回空字符串。
陷阱2:年份超限:年份超过 9999 时,strftime 可能引发 ValueError。对于超出范围的年份,应使用字符串拼接替代。
陷阱3:%f 限制:%f(微秒)仅在 datetime 和 time 对象上有效,date 对象不支持 %f。
陷阱4:Windows时区名:Windows 平台上 %Z 可能返回中文时区名(如"中国标准时间"),而 Linux 上可能返回"CST"等缩写。
小贴士
对于简单的 ISO 格式输出,推荐直接使用 isoformat() 方法,它更简洁且跨平台一致。例如 datetime.now().isoformat() 输出 2024-01-15T14:30:00.123456。
八、格式化方法对比
九、FAQ 常见问题
常见问题
strftime 和 str() 有什么区别?
str() 使用固定的默认格式(如"2024-01-15 14:30:00"),不可定制。strftime 允许你通过格式化指令完全控制输出格式,如"%Y年%m月%d日"输出"2024年01月15日"。
如何输出中文的星期和月份?
strftime 的 %A 和 %B 返回英文星期和月份。要获取中文,可以使用自定义映射:WEEKDAYS = {0: "星期一", ...} 或使用 locale 模块设置中文区域。
格式化字符串中的百分号怎么输出?
使用 %% 来输出一个百分号字面量。例如 dt.strftime("进度:%Y年已完成%%50") 会输出 "进度:2024年已完成%50"。
strftime 支持毫秒(三位数)吗?
strftime 的 %f 返回 6 位微秒。如果需要 3 位毫秒,可以截取前 3 位:dt.strftime("%Y-%m-%d %H:%M:%S.") + dt.strftime("%f")[:3]。
十、练习题
练习1
编写一个函数,将当前日期时间格式化为以下格式:"第15周 2024年1月15日 星期一 14:30:00"。
练习2
编写一个函数 generate_filename(prefix, dt=None),生成安全的文件名字符串,格式为 prefix_YYYYMMDD_HHMMSS.ext,确保不包含特殊字符。
练习3
编写一个函数,接受格式化字符串和 datetime 对象,返回格式化结果,并对不支持的格式化指令提供友好的错误提示。
本文涉及AI创作
内容由AI创作,请仔细甄别