python时间精度受系统限制,time.time()等默认支持微秒但不稳定;time.time_ns()最可靠,可换算纳秒/微秒/毫秒;datetime.microsecond仅表示秒内微秒;浮点时间戳存在精度丢失风险。

Python 中的时间精度取决于所用模块和系统支持,毫秒(ms)和微秒(μs)是常见但易混淆的单位。默认情况下,time.time() 和 datetime.now() 在大多数系统上可返回微秒级浮点数或 datetime 对象,但实际精度受操作系统和硬件限制,并非总能稳定达到微秒级。
毫秒与微秒的单位换算和表示
1 秒 = 1000 毫秒 = 1 000 000 微秒。
在 Python 中:
-
time.time()返回自纪元以来的秒数(float),小数部分通常精确到微秒(如1718234567.123456表示 123456 微秒,即 123.456 毫秒) -
datetime.timestamp()同样返回 float 秒值,精度一致 -
datetime.microsecond属性直接返回 0–999999 范围内的微秒数(不包含秒和毫秒的“余数”) - 若需毫秒,常用
int(timestamp * 1000) % 1000或dt.microsecond // 1000
不同模块的时间精度表现
各标准库模块对时间精度的支持有差异:
-
time.time():POSIX 系统通常提供微秒级分辨率,Windows 上可能仅达 15–16 毫秒(旧版)或 1 毫秒(Win10+ 配合time.time_ns()) -
time.time_ns()(Python 3.7+):返回纳秒整数,是目前最可靠的高精度接口,需自行换算(如// 1_000_000得毫秒,// 1000得微秒) -
datetime.now():构造的datetime对象默认精度为微秒;但若传入tzinfo或使用某些时区处理,可能截断精度 -
time.perf_counter():专为性能测量设计,无绝对时间意义,但提供最高可用单调精度(常优于微秒),适合测间隔
安全获取毫秒/微秒时间戳的方法
避免依赖浮点秒值的小数截断误差,推荐以下实践:
立即学习“Python免费学习笔记(深入)”;
- 要毫秒时间戳(自纪元起的整数毫秒):
int(time.time_ns() // 1_000_000) - 要微秒时间戳(自纪元起的整数微秒):
int(time.time_ns() // 1000) - 从
datetime提取毫秒字段:dt = datetime.now(); ms = dt.microsecond // 1000(注意:这只是秒内毫秒,不是自纪元起) - 保存高精度日志时,优先用
time.time_ns()记录原始整数,后期再按需格式化,避免 float 累积误差
常见陷阱与注意事项
实际开发中容易忽略的关键点:
- 浮点秒值(如
time.time())在大数值时无法精确表示微秒——例如超过 253 的秒值(约公元 2255 年后),float 将丢失微秒甚至毫秒位 -
datetime.utcnow()已弃用,且其精度不保证高于datetime.now(timezone.utc) - 跨平台计时慎用
time.clock()(已移除)或未校准的time.time();高要求场景统一用time.perf_counter_ns() - 序列化时间(如 JSON)时,
datetime默认不保留微秒;需显式用isoformat()并指定timespec='microseconds'










