如何将time.Duration格式化/字符串化为ISO8601?例如P3Y6M4DT12H30M5S
答案 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)。
我不知道可能仍然存在什么样的标准符合标准,但这会让你非常接近。