microtime(true) 是 php7 微秒精度的主力函数,返回浮点数时间戳,精度受系统限制;hrtime() 自 php7.3 起提供纳秒级单调时间;生成毫秒整数须用 round() 避免截断误差。

microtime(true) 是 PHP7 微秒精度的主力函数
PHP7 中 microtime(true) 仍是最常用、最可靠的微秒级时间获取方式,返回浮点数(如 1715823456.789123),小数点后最多 6 位代表微秒。它不依赖时区,直接基于系统 gettimeofday(),精度稳定在微秒级。
注意:虽然叫“微秒”,但实际精度受操作系统和硬件限制,Linux 下通常可达 1–10 微秒,Windows 可能略低(尤其旧版本)。
- 必须传
true,否则默认返回字符串"0.789123 1715823456",需额外explode()解析,易出错且慢 - 避免在高并发循环中频繁调用——单次调用开销极小,但百万次叠加仍可观;可考虑缓存一次值用于同请求内多处打点
-
microtime(true)返回的是绝对时间(Unix 纪元起秒数),不是相对或单调时间,系统时间被手动调整会导致跳变
hrtime() 在 PHP7.3+ 才可用,且更适合作为替代方案
PHP7.3 起引入了 hrtime(),它返回纳秒级单调时间(不受系统时钟修改影响),更适合性能压测、事件顺序判定等场景。但它不是“时间戳”,而是自某未知起点起的纳秒计数器。
典型用法:hrtime(true) 返回整型纳秒值(如 1715823456789123456),除以 1000 得微秒,除以 1000000 得毫秒。
- 若你用的是 PHP7.2 或更低,
hrtime()不可用,强行调用会报Fatal error: Uncaught Error: Call to undefined function hrtime() -
hrtime()的值不能直接传给date()或存入 MySQLDATETIME字段——它不是 Unix 时间戳 - 想兼容 PHP7.0–7.2 与 7.3+,可用
function_exists('hrtime')判断后降级到microtime(true)
生成毫秒整数时间戳要 round(),别用 (int) 强转
很多开发者写 (int)(microtime(true) * 1000) 想取毫秒整数,这是错的——(int) 是截断,不是四舍五入。比如 1715823456.999999 × 1000 = 1715823456999.999,强转后变 1715823456999,丢失了接近 1 毫秒。
正确做法是:(int) round(microtime(true) * 1000)。
- PHP7 对
round()的 IEEE 754 行为已稳定,无需担心跨平台差异 - 如果只是内部排序或日志标记,保留浮点值(如
microtime(true))反而更安全,避免整数溢出风险(尤其 32 位环境) - 前端 JS 的
Date.now()返回毫秒整数,PHP 后端若要对齐,必须用round(),否则两边时间差可能恒为 ±1ms
DateTime::format('u') 和 'v' 的区别容易混淆
用 DateTime 类也能拿到微秒/毫秒,但格式符含义必须分清:u 是微秒(6 位,如 123456),v 是毫秒(3 位,PHP 7.3+ 支持,如 123)。两者不能混用。
例如:(new DateTime())->format('Y-m-d H:i:s.u') 输出 2026-09-17 14:24:33.123456;而 ->format('Y-m-d H:i:s.v') 输出 2026-09-17 14:24:33.123。
-
u始终存在(PHP 5.2+),v在 PHP 7.3 之前无效,用会输出空字符串 - 若需拼接成
yyyyMMddHHmmssSSS格式(如 API 要求),优先用v,简洁安全;若要兼容老版本,就用u再除以 1000 并sprintf('%03d', ...) -
DateTime::getTimestamp()只返回秒级整数,无法满足微秒需求,别误用
微秒精度真正难的不是获取,而是后续处理的一致性:同一请求里混用 microtime(true)、hrtime()、DateTime 三套机制,又不做单位归一,很容易在日志比对或分布式追踪时发现毫秒对不上。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











