如何格式化持续时间

时间:2016-06-23 02:12:37

标签: date go iso8601

如何将time.Duration格式化/字符串化为ISO8601?例如P3Y6M4DT12H30M5S

1 个答案:

答案 0 :(得分:4)

如果您只有一个time.Duration且没有上下文,那么您运气不好:Duration只计算纳秒数,一个月内的纳秒数会随天数而变化。有类似的,较小的不规则性,夏令时转换(mentioned in docs),闰日和闰秒(Go {'time包甚至不考虑闰秒。)

给定两个time.Time值,看起来github.com/rickb777/date/period会执行您想要的操作,包括格式化 - 这会打印P3Y1M21DT17H18M58S

package main

import (
    "fmt"
    "github.com/rickb777/date/period"
    "log"
    "time"
)

func main() {
    t1, err := time.Parse(time.RFC3339, "2012-11-03T13:41:02Z")
    if err != nil {
        log.Fatal(err)
    }
    t2, err := time.Parse(time.RFC3339, "2015-12-25T07:00:00Z")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(period.Between(t1, t2))
}

我在another question用户icza中找到了与此相关的链接以及其他信息,这些信息链接到了与人类可读的X相关的紧密相关问题。字符串。

在下面,您在两个Year()上调用Month()Time等,并获得他们的差异(占不同长度的月份)。 icza wrote out code for that answering that other question。然后格式化和存储这些差异是相对容易的部分,并且也可以通过例如ChannelMeter/iso8601duration' Duration(改编自BrianHicks/finch)。

我不知道可能仍然存在什么样的标准符合标准,但这会让你非常接近。