Python当前时间格式化指南:strftime常用格式代码与示例
在 Python 中获取并格式化当前系统时间的核心操作路径非常清晰:首先从标准库中导入 datetime 类,调用 datetime.now() 取得当前时间实例,随后执行该对象的 strftime(format) 方法并传入指定的格式化代码,即可快速生成符合业务要求的日期与时间字符串。
一、获取并格式化当前时间的三步流程
处理日期与时间是各类开发任务中的高频需求,例如记录运行日志、为导出文件命名、构造数据库查询参数等。Python 提供了内置的 datetime 模块,无需额外安装第三方依赖包即可完成从时间捕获到文本转换的全流程。
标准操作可以划分为三个严谨步骤:引入类定义、捕获即时时间对象、调用格式化方法输出字符串。整个过程输入输出可预测,逻辑清晰。
下面是实现这一三步流程的基础完整代码:
from datetime import datetime
# 步骤 1 & 2:获取当前本地时间
now = datetime.now()
# 步骤 3:调用 strftime 将时间对象格式化为常见格式
formatted_time = now.strftime("%Y-%m-%d %H:%M:%S")
print(f"当前时间为: {formatted_time}")
二、strftime 的工作原理与内部字段映射
函数名称 strftime 是 string format time 的缩写。从底层机制来看,datetime.now() 返回的是一个复合数据对象,其内部独立保存了 year、month、day、hour、minute、second 和 microsecond 等整型属性。
当我们向 strftime() 传入带有特定格式占位符(如 %Y、%m、%d)的模板字符串时,解释器会按顺序扫描模板:
- 遇到普通字符(如连字符
-、冒号:或空格)时,原样保留; - 遇到以百分号
%开头的指令代码时,提取当前时间对象中对应的数值字段,按照该指令规定的规则(如是否带前导零、进制模式、位数约束)转换为文字后替换对应位置。
三、常用格式代码分类与对照速查
为了在实际编码中快速查阅,我们将常用格式代码分为三类:日期相关代码、时间相关代码,以及区域与组合代码。
1. 日期格式代码表
| 指令代码 | 含义与范围 | 示例返回值 | 说明与注意点 |
|---|---|---|---|
%Y |
4位完整公历年份 | 2026 |
绝大多数业务推荐使用,避免世纪歧义 |
%y |
2位缩写年份(00-99) | 26 |
仅保留最后两位数 |
%m |
2位补零月份(01-12) | 10 |
单数月份(如3月)会自动补零为 03 |
%d |
2位补零日期(01-31) | 20 |
同理单数日期会补零 |
%b / %B |
月份的本地化缩写 / 全称 | Oct / October |
输出语言受当前系统 locale 影响 |
2. 时间格式代码表
| 指令代码 | 含义与范围 | 示例返回值 | 说明与注意点 |
|---|---|---|---|
%H |
24小时制小时数(00-23) | 13 |
工程日志与数据库存储首选 |
%I |
12小时制小时数(01-12) | 01 |
通常搭配 %p 使用 |
%p |
上午或下午标识(AM/PM) | PM |
在中文语言环境下可能呈现为“下午” |
%M |
2位补零分钟数(00-59) | 13 |
注意必须大写;小写 %m 代表月份 |
%S |
2位补零秒数(00-59) | 50 |
大写;小写 %s 在部分平台代表UNIX戳 |
%f |
6位微秒数(000000-999999) | 654321 |
高精度日志记录核心参数 |
四、高频实用场景代码示例
不同业务系统对时间格式的诉求各异。下面整理四种最常见的使用模式与可直接复用的代码片段:
场景 1:标准工程日志与数据库格式
该格式采用国际通行的 年-月-日 时:分:秒,严格保持单调字符长度,便于文件排序与数据库比对:
from datetime import datetime
now = datetime.now()
log_format = now.strftime("%Y-%m-%d %H:%M:%S")
print(f"日志标准格式: {log_format}")
场景 2:安全的文件名与备份压缩包时间戳
在 Linux、Windows 或 macOS 系统中,文件名包含冒号 : 或空格可能引发兼容性问题或路径解析异常。通常使用紧凑的纯数字命名方式:
from datetime import datetime
now = datetime.now()
filename_stamp = now.strftime("%Y%m%d_%H%M%S")
file_name = f"backup_database_{filename_stamp}.sql.gz"
print(f"生成安全文件名: {file_name}")
场景 3:包含毫秒精度的时间戳
在高并发排查、接口性能监控中,微秒 %f 输出 6 位数字,若需要 3 位毫秒,可通过切片截取前 3 位:
from datetime import datetime
now = datetime.now()
# %f 获取 6 位微秒,截取前 3 位即为毫秒
millisecond = now.strftime("%f")[:3]
time_with_ms = now.strftime(f"%Y-%m-%d %H:%M:%S.{millisecond}")
print(f"高精度时间戳: {time_with_ms}")
场景 4:12小时制与星期展示
from datetime import datetime
now = datetime.now()
human_format = now.strftime("%Y年%m月%d日 %I:%M %p (%A)")
print(f"友好展示格式: {human_format}")
五、工程决策建议与跨平台避坑指南
在将当前时间格式化落地到具体工程项目时,有几个容易引发隐蔽 Bug 的细节需要注意:
1. Windows 环境下中文字符格式化的安全写法
在 Windows 系统下,如果直接执行 now.strftime("%Y年%m月%d日"),由于 Python 的 strftime 在底层调用了操作系统的 C 标准库 strftime(),中文字符可能会导致 UnicodeEncodeError: 'locale' codec can't encode character 错误。
推荐的跨平台安全方案是使用 Python 原生的字符串 format() 方法或 f-string 配合格式化:
from datetime import datetime
now = datetime.now()
# 推荐的安全跨平台写法:只用 strftime 提取纯数字,中文字符由 Python 字符串组装
safe_chinese = now.strftime("%Y{y}%m{m}%d{d}").format(y="年", m="月", d="日")
print(f"跨平台安全中文格式: {safe_chinese}")
2. 时区感知时间(Timezone-aware)的处理
默认执行 datetime.now() 得到的是不含时区属性的“朴素时间(Naive DateTime)”。在分布式系统或海外节点部署中,朴素时间无法明确区分是 UTC 时间还是本地时间。
引入 Python 内置的 timezone 类即可构建时区感知的标准时间,并使用 %z 输出时区偏移:
from datetime import datetime, timezone
# 显式获取带 UTC 时区的时间对象
utc_now = datetime.now(timezone.utc)
formatted_utc = utc_now.strftime("%Y-%m-%d %H:%M:%S %z")
print(f"UTC 带时区格式: {formatted_utc}")
六、全文总结
格式化 Python 当前时间是日常开发中的基础技能,核心要点可概括为以下三点:
- 标准流程:牢记
from datetime import datetime导入模块、datetime.now()获取当前时间、strftime()传入模板进行文本转换的三步流水线。 - 核心代号记忆:最常用的核心指令包含 4 位年份
%Y、补零月份%m、补零日期%d、24小时制小时%H、分钟%M和秒数%S。牢记大写的%M代表分钟,小写的%m代表月份。 - 工程防坑:涉及跨系统 API 时优先使用标准 ISO 格式,涉及中文日期时避免在
strftime模板中直传中文字符,分布式场景务必配合timezone记录清晰的时区偏移。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













