如何通过插入分:秒:毫秒格式时间计算时长?游戏模式计时优化
游戏计时:从模式启动到抵达的分:秒:毫秒耗时计算方案
嘿,这个需求太常见了!我之前做竞速类游戏模式的时候也折腾过类似的计时逻辑,给你分享一套靠谱的实现思路:
核心逻辑:用高精度时间戳算差值,再格式化
别用字符串格式的时间来做减法,直接拿两个时间点的高精度时间戳计算差值,再把差值转换成你要的分:秒:毫秒格式,这是最准确也最省心的方式。
步骤拆解
记录两个关键时间点
模式启动时,记下当前的高精度时间戳(要精确到毫秒甚至微秒);玩家抵达目的地时,再记一次。
不同语言的实现略有不同,但核心都是找能输出小数秒/毫秒级的函数:- PHP用
microtime(true)(返回带小数的秒数,比如1698765432.123456) - JavaScript用
performance.now()(返回从页面加载开始的毫秒数,精度更高) - Python用
time.time()(返回带小数的秒数)
- PHP用
计算时间差
用抵达时的时间戳减去启动时的时间戳,得到的就是总耗时(单位:秒/毫秒,看你用的函数)。格式化成i:s:u(分:秒:毫秒)
把总耗时拆解成分钟、秒、毫秒三个部分,然后补零格式化,保证格式统一(比如1分钟5秒78毫秒要显示成01:05:078)。
代码示例(PHP版)
// 模式启动时记录起始时间戳 $startTimestamp = microtime(true); // 玩家抵达时记录结束时间戳 $endTimestamp = microtime(true); // 计算总耗时(单位:秒,带小数) $totalSeconds = $endTimestamp - $startTimestamp; // 拆解成分钟、秒、毫秒 $minutes = floor($totalSeconds / 60); $seconds = floor($totalSeconds % 60); $milliseconds = floor(($totalSeconds - floor($totalSeconds)) * 1000); // 格式化输出:补零到两位(分钟、秒),三位(毫秒) $formattedTime = sprintf("%02d:%02d:%03d", $minutes, $seconds, $milliseconds); // 示例输出:02:05:789 echo $formattedTime;
代码示例(JavaScript版)
// 模式启动时记录起始毫秒数 const startMs = performance.now(); // 玩家抵达时记录结束毫秒数 const endMs = performance.now(); // 计算总耗时(单位:毫秒) const totalMs = endMs - startMs; // 拆解成分钟、秒、毫秒 const minutes = Math.floor(totalMs / 60000); const seconds = Math.floor((totalMs % 60000) / 1000); const milliseconds = Math.floor(totalMs % 1000); // 格式化输出:补零处理 const formattedTime = `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}:${String(milliseconds).padStart(3, '0')}`; // 示例输出:02:05:789 console.log(formattedTime);
注意事项
- 优先用高精度时间函数:别用只精确到秒的时间戳(比如PHP的
time()),不然毫秒部分就没了。 - 存储原始值,按需格式化:如果要把耗时存到数据库,建议存原始的时间差(比如毫秒数或带小数的秒数),不要存格式化后的字符串——后续要改格式、做排序统计都方便。
- 补零很重要:用
sprintf或者padStart补零,保证所有时长的格式统一,看起来更专业。
内容的提问来源于stack exchange,提问作者LewBr
相关产品推荐
相关产品推荐

