%f 是关键
Python 的 datetime 模块的 strftime 方法使用 %f 来表示微秒(1秒 = 1,000,000微秒)。

%f: 6位数字的微秒,格式为000000到999999。
因为 1毫秒 = 1000微秒,所以我们可以利用 %f 来轻松获取毫秒。
直接使用 %f(最常用)
这是最直接、最简单的方法,你只需要在格式字符串中加入 %f 即可。
示例代码:
import datetime
# 获取当前时间
now = datetime.datetime.now()
# 使用 %f 格式化,包含微秒
formatted_with_microseconds = now.strftime("%Y-%m-%d %H:%M:%S.%f")
print(f"完整微秒时间: {formatted_with_microseconds}")
# 如果只想显示毫秒,可以手动截取
# 格式字符串中,%f 会填充6位,我们取前3位
formatted_with_milliseconds = now.strftime("%Y-%m-%d %H:%M:%S.") + now.strftime("%f")[:3]
print(f"截取毫秒时间: {formatted_with_milliseconds}")
输出结果:

完整微秒时间: 2025-10-27 15:30:45.123456
截取毫秒时间: 2025-10-27 15:30:45.123
解释:
now.strftime("%Y-%m-%d %H:%M:%S.%f")会生成一个包含完整6位微秒的字符串。now.strftime("%f")[:3]会先获取6位微秒的字符串,然后通过切片[:3]只保留前3位,也就是毫秒。
先格式化到秒,再拼接毫秒(更灵活)
这种方法在某些情况下可能更清晰,特别是当你需要更精细地控制毫秒的显示格式(比如不足3位补零)时。
示例代码:
import datetime
now = datetime.datetime.now()
# 1. 格式化到秒
time_to_seconds = now.strftime("%Y-%m-%d %H:%M:%S")
# 2. 获取微秒对象
microseconds = now.microsecond
# 3. 将微秒转换为毫秒 (整数除法)
milliseconds = microseconds // 1000
# 4. 拼接起来
# 使用 f-string 格式化,可以轻松控制补零
formatted_time = f"{time_to_seconds}.{milliseconds:03d}"
print(f"方法二结果: {formatted_time}")
输出结果:
方法二结果: 2025-10-27 15:30:45.123
解释:
now.microsecond直接获取一个表示微秒的整数(0-999999)。// 1000是整数除法,将微秒转换为毫秒(0-999)。f"{milliseconds:03d}"是一个 f-string 的格式化语法,03d表示将数字格式化为3位十进制整数,不足的前面补零,如果milliseconds是5,它会显示为005,这比手动切片更健壮。
处理 time 对象(time.strftime 的限制)
如果你使用的是 datetime.time 对象,需要注意一个重要的限制:time.strftime 不支持 %f。
示例代码(会报错):
import datetime
import time
# 创建一个 time 对象
t = datetime.time(12, 30, 45, 123456) # 12:30:45.123456
# 这行代码会报错!
# ValueError: Invalid format string
# formatted = t.strftime("%H:%M:%S.%f")
如何解决?
解决方案和 datetime 对象类似,手动拼接:
import datetime
t = datetime.time(12, 30, 45, 123456)
# 手动格式化时分秒
time_str = t.strftime("%H:%M:%S")
# 获取毫秒
milliseconds = t.microsecond // 1000
# 拼接
formatted_time = f"{time_str}.{milliseconds:03d}"
print(f"time对象带毫秒: {formatted_time}")
输出结果:
time对象带毫秒: 12:30:45.123
总结与最佳实践
| 场景 | 推荐方法 | 优点 | 缺点 |
|---|---|---|---|
datetime 对象 |
方法一 (%f + 切片) |
代码最简洁,一行搞定。 | 切片 [:3] 假设 %f 总是6位,虽然几乎总是如此,但理论上不够“显式”。 |
datetime 对象 |
方法二 (拼接) | 逻辑清晰,易于理解,使用 03d 可以完美处理补零。 |
代码稍多,需要几步操作。 |
time 对象 |
方法二 (拼接) | 唯一可行的方法,因为 time.strftime 不支持 %f。 |
需要手动处理。 |
综合推荐:
对于 datetime 对象,方法一 是最常用和最 Pythonic 的方式,简洁高效。
对于 time 对象,必须使用方法二。
常见格式化代码速查表
| 格式代码 | 含义 | 示例 |
|---|---|---|
%Y |
4位年份 | 2025 |
%m |
2位月份 (01-12) | 10 |
%d |
2位日期 (01-31) | 27 |
%H |
2位小时 (24小时制, 00-23) | 15 |
%M |
2位分钟 (00-59) | 30 |
%S |
2位秒 (00-59) | 45 |
%f |
6位微秒 (000000-999999) | 123456 |
%z |
UTC偏移量 (e.g., +0800) | +0800 |
%Z |
时区名称 (e.g., CST) | CST |
