如何格式化持续时间
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)。
我不知道总体标准合规性可能还有哪些问题,但这让您非常接近。
我怎样才能 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))
}
我在
下面,您在两个 Time
上调用 Year()
、Month()
等,并获取它们的差异(占不同的月长)。 Duration
(adapted from BrianHicks/finch)。
我不知道总体标准合规性可能还有哪些问题,但这让您非常接近。