datetime::format() 使用 u 输出微秒(6位)而非毫秒(3位),是因为 php 的日期时间底层基于 unix 时间戳,其精度定义在 posix 标准中为秒与微秒。php 内部将纳秒截断为微秒存储,因此格式化时必须输出完整的 6 位数字以符合规范。

DateTime 对象如何存储和解析微秒
当创建 DateTime 对象时,PHP 会将传入的时间字符串解析为秒和微秒两部分。如果输入只包含到毫秒级别,PHP 会自动在末尾补零至 6 位。这种存储方式确保了内部计算的一致性,避免了浮点数精度问题。

$dt = new DateTime('2023-10-27 10:00:00.123456');
echo $dt->format('u'); // 输出: 123456
$dt2 = new DateTime('2023-10-27 10:00:00.123');
echo $dt2->format('u'); // 输出: 123000
为什么 microtime() 返回的值需要转换
microtime(true) 返回一个浮点数,其中小数部分代表微秒。由于浮点数的二进制表示特性,直接截取可能会丢失精度或产生舍入误差。因此,在将其转换为 DateTime 或格式化输出时,必须通过特定的逻辑处理以确保得到准确的 6 位微秒值。
立即学习“PHP免费学习笔记(深入)”;

$micro = microtime(true);
$sec = (int) floor($micro);
$usec = (int) round(($micro - $sec) * 1000000);
echo sprintf('%06d', $usec); // 输出: 123456
如何处理不足 6 位的微秒输入
如果在初始化 DateTime 时提供的微秒位数不足 6 位,例如只提供 3 位毫秒,PHP 会将其视为精确到该位数的值,并在后续补零。这种行为保证了输出的固定长度,但同时也意味着低位精度被假定为零。开发者在解析外部数据时需注意这一点,避免误以为高位精度更高。



















