如何格式化持续时间

How to format Duration

我怎样才能 format/stringify 一个 time.Duration 变成 ISO8601 ?例如P3Y6M4DT12H30M5S

如果您只有 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))
}

我在 用户 icza linked 中找到了 link 以及其他信息,关于打印人类可读的密切相关问题 "X months ago" 字符串.

下面,您在两个 Time 上调用 Year()Month() 等,并获取它们的差异(占不同的月长)。 . Then formatting and storing those differences is the relatively easier part, and is also done by, e.g. ChannelMeter/iso8601duration's Duration (adapted from BrianHicks/finch)。

我不知道总体标准合规性可能还有哪些问题,但这让您非常接近。