
本文详解如何将形如 MM:SS.mmm 的时间字符串(例如 "01:26.7")安全、准确地转换为自零点起的总毫秒数,避免直接乘法导致的精度丢失,并提供可复用的代码实现与关键注意事项。
本文详解如何将形如 `mm:ss.mmm` 的时间字符串(例如 "01:26.7")安全、准确地转换为自零点起的总毫秒数,避免直接乘法导致的精度丢失,并提供可复用的代码实现与关键注意事项。
在 PHP 中,将时间字符串(如 "01:26.7",表示 1 分 26 秒 7 毫秒)转换为毫秒值,*不能简单使用 `time() 1000**——因为time()返回的是 Unix 时间戳(自 1970-01-01 起的秒数),与相对时间无关;而此处的"01:26.7"` 是一个持续时长(duration),需按分、秒、毫秒逐级解析并累加。
正确做法是:解析字符串结构 → 提取分钟、秒、毫秒 → 统一换算为毫秒 → 求和。以下是推荐的健壮实现:
function timeStringToMilliseconds(string $timeStr): int
{
// 支持格式:MM:SS.mmm(如 "01:26.7" 或 "05:42.350")
if (!preg_match('/^(\d{1,2}):(\d{1,2})\.(\d{1,3})$/', $timeStr, $matches)) {
throw new InvalidArgumentException("Invalid time format. Expected 'MM:SS.mmm', e.g., '01:26.7'");
}
$minutes = (int)$matches[1];
$seconds = (int)$matches[2];
$milliseconds = (int)substr($matches[3], 0, 3); // 截取最多3位,防止超长(如 .7000 → .700)
// 标准换算:1 分 = 60 × 1000 ms,1 秒 = 1000 ms
return $minutes * 60 * 1000 + $seconds * 1000 + $milliseconds;
}
// 使用示例
echo timeStringToMilliseconds("01:26.7"); // 输出:86700(即 86 秒 700 毫秒 = 86700 ms)
echo timeStringToMilliseconds("05:42.350"); // 输出:342350✅ 优势说明:
- 使用正则校验格式,避免 explode 在边界异常(如缺少小数点或秒数超两位)时静默出错;
- 自动截断毫秒部分至 3 位,兼容 .7(等价于 .700)和 .350 等常见输入;
- 明确抛出异常,便于调试与错误处理;
- 函数纯且无副作用,适合集成到工具类或 Laravel Helper 中。
⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 此方法处理的是相对时长,非绝对时间(如 2024-05-20 01:26.7)。若需将绝对时间转毫秒,请用 DateTime::getTimestamp() * 1000 + $dateTime->format('u') / 1000 或 Carbon 的 timestampMs;
- 输入中毫秒部分若不足 3 位(如 .7),PHP 会自动补零(.7 → 700 ms),符合常规语义;
- 如需支持 HH:MM:SS.mmm 或负值时长,需扩展正则与逻辑,但核心思路不变:分段解析 → 单位归一 → 累加求和。
掌握该模式后,你不仅能精准处理计时器、视频片段、性能日志等场景中的毫秒转换需求,也为后续对接 JavaScript Date.now() 或数据库 BIGINT 时间字段打下坚实基础。











