php time() 只到秒级是因为 unix 时间戳规范定义为整秒数,非 bug;需毫秒/微秒精度应使用 microtime(true) 或 hrtime()(php 7.3+),注意数据库存储、orm 和前端展示等环节需同步支持。

PHP time() 为什么只到秒级,没法精确到毫秒?
因为 time() 返回的是 Unix 时间戳,定义就是“自 1970-01-01 00:00:00 UTC 起经过的整秒数”,它天生不带小数位。这不是 bug,是规范本身决定的。
如果你在日志里看到两个操作时间一样,或者想测函数执行耗时低于 1 秒,time() 就完全没用——它连“哪个先发生”都分不清。
- 别试图对
time()结果乘以 1000 来“模拟毫秒”,那只是数值放大,不代表真实精度 - 需要毫秒/微秒级,必须换函数:
microtime(true)(推荐)或hrtime()(PHP 7.3+) -
microtime(true)返回浮点数,单位是秒,小数部分是微秒(如1715823495.123456表示 123456 微秒 = 123.456 毫秒)
microtime(true) 在 CLI 和 Web 环境下表现一致吗?
基本一致,但要注意系统时钟精度和 PHP 配置的影响。Linux 上通常能稳定到微秒级,Windows 可能受系统定时器分辨率拖累(默认 15.6ms),导致连续两次 microtime(true) 返回值相同。
- Web 环境中,如果用了 OPcache + 静态编译优化,某些极端情况会缓存时间戳(极少见,但有报告)
- CLI 下更可控,适合压测或性能分析
- 不要依赖
microtime()做分布式唯一序号——它不保证单调递增,多进程/多线程下可能回跳
用 hrtime() 替代 microtime() 有什么实际区别?
hrtime() 返回的是纳秒级整数数组(如 [123456789, 987654]),比 microtime(true) 更准、更稳定,且明确设计用于高性能计时,不受系统时钟调整影响(比如 NTP 校时不会让它跳变)。
立即学习“PHP免费学习笔记(深入)”;
-
hrtime()是 PHP 7.3+ 才有的,老版本不能用 - 计算耗时时,必须用两次调用相减:
$start = hrtime(true); ... $end = hrtime(true); $diff = $end - $start;(单位:纳秒) - 直接 echo
hrtime(true)会输出极大整数,容易溢出或显示不全,建议除以 1e6 转毫秒再处理 - 它不等于“当前时间”,不能转成日期,只适合测间隔
MySQL 插入时间字段时,PHP 时间戳精度丢失怎么破?
常见场景:PHP 用 microtime(true) 记了 123.456 毫秒,存进 MySQL 的 DATETIME(3) 字段,结果查出来变成 123.000——问题不在 PHP,而在你传值的方式。
- 别把浮点时间戳直接拼进 SQL:
"INSERT ... VALUES ($ts)",PHP 浮点数精度和 MySQL 类型转换会丢位 - 正确做法:用
date('Y-m-d H:i:s.u', floor($ts))提取微秒部分,再组合字符串;或用 PDO 绑定参数 +DateTime对象 - MySQL 5.6.4+ 支持
DATETIME(6),但 PHP 的date()函数u格式符只输出 6 位微秒,且末尾补零,不截断——这点常被忽略 - 如果用 ORM(如 Laravel Eloquent),确认它是否自动处理微秒;很多默认只到秒,得显式设置
$model->created_at = now()->micro()类似逻辑
事情说清了就结束。真正麻烦的不是“怎么拿到毫秒”,而是后续所有环节——数据库字段类型、SQL 构建方式、ORM 行为、甚至前端展示时要不要四舍五入——都得跟着对齐,漏一环就白忙。











