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

在这种情况下,uint64 值不指定具体日期。

我正在使用 uint64 以毫秒为单位显示视频的特定点。

如标题所示,我需要转换这个整数值。我认为使用简单的数学来解决这个问题会导致问题(舍入等)。


以下是该场景的示例:


点 60104:参考第 0 小时、第 1 分钟、第 0 秒和第 104 毫秒。


package main


import "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++ 编写算法。这里的关键是算法。


ibeautiful
浏览 144回答 1
1回答

手掌心

使用time包如果持续时间少于一天,您可以简单地将其添加到具有零时间部分的参考时间戳,然后使用适当的布局格式化时间。参考时间可以是零值time.Time或unix参考时间。例如:ms := int64(65104)var t time.Time // Zero timet = 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,10400:01:05,104如果您想处理超过一天的持续时间,则此解决方案不适合。一个可能的解决办法是自己计算小时,其余的(分、秒、毫秒)用上面的方法。例如:const msInHour = 60 * 60 * 1000func 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,10427: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,10427:01:05,104
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go