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)

常用格式化指令

指令 含义 示例值
%Y 四位年份 2024
%y 两位年份 24
%m 月份(01-12) 01
%d 日期(01-31) 15
%H 24小时制小时(00-23) 14
%I 12小时制小时(01-12) 02
%M 分钟(00-59) 30
%S 秒(00-59) 00
%f 微秒(000000-999999) 123456
%A 星期全称 Monday
%a 星期缩写 Mon
%B 月份全称 January
%b 月份缩写 Jan
%p AM/PM PM
%j 年内天数(001-366) 015
%U 年内周数(周日起始) 02
%W 年内周数(周一起始) 02
%w 星期数字(0=周日) 1
%Z 时区名称 UTC
%z 时区偏移 +0800
%% 百分号字面量 %

三、常用格式化模板示例

以下示例展示了多种常用的日期时间格式化模板,覆盖日常开发中的大部分场景:

代码示例

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


八、格式化方法对比

特性 strftime isoformat str()
格式化灵活性 非常高 固定格式 固定格式
跨平台一致性 可能有差异 一致 一致
学习成本 中等
适用对象 date/time/datetime date/time/datetime 所有对象
推荐场景 自定义格式 标准格式 调试输出

九、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 对象,返回格式化结果,并对不支持的格式化指令提供友好的错误提示。

标签: strftime 日期格式化 Python标准库 datetime 时间格式化

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python timezone详解 - 时区处理与跨时区时间转换 下一篇: Python strptime详解 - 字符串解析为日期时间的完整指南

poll相关推荐