You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 20:18:31