使用 microtime(true) 乘以 1000 并转为 13 位整数,核心在于利用 php 的浮点数精度和类型转换。直接对 microtime(true) 的结果执行乘法运算后,使用 (int) 强转或 floor() 函数截断小数部分即可得到精确的毫秒时间戳。需要注意的是,php 默认浮点数精度可能不足以保留完整的小数位,建议在计算前开启高精度设置或使用字符串处理来确保 13 位长度的准确性。

如何避免浮点数精度丢失导致位数不足
在常规环境下,microtime(true) 返回的是秒级浮点数,直接乘以 1000 后如果不经特殊处理,可能会因为浮点数的二进制表示误差导致最后几位数字不准确,或者在某些极端情况下长度不足 13 位。最稳妥的做法是先获取微秒部分,再拼接秒部分,或者使用 bcmath 扩展进行高精度计算。对于大多数业务场景,直接使用 (int) (microtime(true) * 1000) 是可行的,但需确认环境配置。

$timestamp = (int) (microtime(true) * 1000); echo $timestamp;
上述代码将输出一个 13 位的整数。例如,若当前时间为 1678886400.123456 秒,乘以 1000 后变为 1678886400123.456,强转为 int 后即为 1678886400123。此方法简单高效,适用于绝大多数非金融级高并发场景。
立即学习“PHP免费学习笔记(深入)”;
使用 bcmath 实现绝对精确的 13 位时间戳
如果对时间戳的精度有极高要求,或者运行环境存在浮点数精度问题,可以使用 PHP 的 bcmath 扩展。通过 bcmul 函数将微秒时间乘以 1000,并指定精度为 0,可以确保结果完全准确且无舍入误差。这种方法虽然稍慢,但能彻底杜绝因浮点数表示导致的位数错误或数值偏差。

$time = microtime(true); $ms = bcmul($time, '1000', 0); echo $ms;
这段代码首先获取当前时间,然后使用 bcmul 将其乘以 1000,第三个参数 0 表示不保留小数位。最终输出的 $ms 是一个字符串形式的 13 位数字,可以直接用于需要严格时间顺序的业务逻辑中。这种方式在处理大规模分布式系统的时间排序时更为可靠。
当系统时钟回拨时 13 位时间戳会出现什么问题
在使用 13 位时间戳作为唯一标识或排序依据时,必须考虑 NTP 同步或手动修改服务器时间导致的“时钟回拨”现象。如果系统时间突然向前调整,新生成的 13 位时间戳可能会小于之前生成的时间戳,从而导致数据错乱、重复 ID 或排序错误。解决这一问题的常见做法是引入单调递增计数器,或在检测到时间回拨时等待至原时间戳之后再生成新值。



















