Go语言如何将uint64类型毫秒值转换为HH:MM:SS,MMM格式
场景说明
当前场景下uint64类型数值不对应真实日期,仅作为视频毫秒级播放点位的标识,需要将其转换为HH:MM:SS,MMM格式的可读时间串,要求转换过程稳定无精度问题,避免浮点运算带来的舍入误差。
转换规则示例
- 点位值60104:对应0小时1分0秒104毫秒
- 点位值65104:期望输出为
00:01:05,104
实现方案
全程采用整数除法、取模运算拆分时间单位,全程无浮点数参与计算,从根源上消除舍入精度问题,逻辑稳定可复用。
Go语言实现
package main import "fmt" func main() { videoPoint := uint64(65104) strVideoPoint := ToReadablePoint(videoPoint) fmt.Println(strVideoPoint) } func ToReadablePoint(point uint64) string { // 拆分各时间单位,全部为整数运算,无精度损耗 millis := point % 1000 totalSecond := point / 1000 second := totalSecond % 60 totalMinute := totalSecond / 60 minute := totalMinute % 60 hour := totalMinute / 60 // 按格式拼接,自动补前导零满足位数要求 return fmt.Sprintf("%02d:%02d:%02d,%03d", hour, minute, second, millis) }
运行上述代码,输入65104时输出结果为00:01:05,104,符合预期。
C语言实现
#include <stdio.h> #include <stdint.h> // 传入输出缓冲区,缓冲区长度建议不小于16字节 void to_readable_point(uint64_t point, char* out_buf) { uint64_t millis = point % 1000; uint64_t total_sec = point / 1000; uint64_t sec = total_sec % 60; uint64_t total_min = total_sec / 60; uint64_t min = total_min % 60; uint64_t hour = total_min / 60; sprintf(out_buf, "%02llu:%02llu:%02llu,%03llu", hour, min, sec, millis); } int main() { uint64_t video_point = 65104; char res[16] = {0}; to_readable_point(video_point, res); printf("%s\n", res); return 0; }
方案可靠性说明
- 无浮点数参与运算,不存在浮点舍入、精度丢失问题
- 格式化阶段通过格式符自动补前导零,严格保证小时、分钟、秒占2位,毫秒占3位的格式要求
uint64类型支持的最大输入值为18446744073709551615,可覆盖超5亿年的毫秒计数,完全不存在时长溢出问题
内容的提问来源于stack exchange,提问作者SeanTolstoyevski
相关产品推荐
相关产品推荐

