为了账号安全,请及时绑定邮箱和手机立即绑定

Go中如何将毫秒(uint64)转成HH:MM:SS,MMM格式

Go中如何将毫秒(uint64)转成HH:MM:SS,MMM格式

Go
ibeautiful 2022-12-19 21:19:58
在这种情况下,uint64 值不指定具体日期。我正在使用 uint64 以毫秒为单位显示视频的特定点。如标题所示,我需要转换这个整数值。我认为使用简单的数学来解决这个问题会导致问题(舍入等)。以下是该场景的示例:点 60104:参考第 0 小时、第 1 分钟、第 0 秒和第 104 毫秒。package mainimport "fmt"// maybe time...func main() {    videoPoint := uint64(65104)    // I want 00:01:05,104    strVideoPoint := ToReadablePoint(videoPoint)    fmt.Println(strVideoPoint)}func ToReadablePoint(point uint64) string {    // algorithm will be written here    return ""}我用的是 Go,但你也可以用 C/C++ 编写算法。这里的关键是算法。
查看完整描述

1 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

使用time包

如果持续时间少于一天,您可以简单地将其添加到具有零时间部分的参考时间戳,然后使用适当的布局格式化时间。


参考时间可以是零值time.Time或unix参考时间。


例如:


ms := int64(65104)


var t time.Time // Zero time

t = t.Add(time.Duration(ms) * time.Millisecond)

fmt.Println(t.Format("15:04:05,000"))


t = time.UnixMilli(ms)

fmt.Println(t.Format("15:04:05,000"))

这将输出(在Go Playground上尝试):


00:01:05,104

00:01:05,104

如果您想处理超过一天的持续时间,则此解决方案不适合。一个可能的解决办法是自己计算小时,其余的(分、秒、毫秒)用上面的方法。


例如:


const msInHour = 60 * 60 * 1000


func format(ms int64) string {

    hours := ms / msInHour

    ms = ms % msInHour

    t := time.UnixMilli(ms)

    return fmt.Sprintf("%02d:%s", hours, t.Format("04:05,000"))

}

测试它:


fmt.Println(format(65104))

fmt.Println(format(27*60*60*1000 + 65104))

这将输出(在Go Playground上尝试):


00:01:05,104

27:01:05,104

推出自己的解决方案

如果你不想使用time包,你可以自己做。该算法只是除法和余数。例如,毫秒部分是除以 1000 后的余数。此后的秒数是除以 60 后的余数,依此类推。


例如:


func format(n int64) string {

    ms := n % 1000

    n /= 1000

    sec := n % 60

    n /= 60

    min := n % 60

    n = n / 60

    return fmt.Sprintf("%02d:%02d:%02d,%03d", n, min, sec, ms)

}

这也处理超过一天的持续时间。测试它:


fmt.Println(format(65104))

fmt.Println(format(27*60*60*1000 + 65104))

这将输出(在Go Playground上尝试):


00:01:05,104

27:01:05,104


查看完整回答
反对 回复 2022-12-19
  • 1 回答
  • 0 关注
  • 143 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号