如何将time.Duration格式化/字符串化为ISO8601?例如P3Y6M4DT12H30M5S
如果您只有一个time.Duration
上下文并且没有上下文,那么您就不走运了:Duration
仅计算纳秒,一个月中的纳秒数会随着天数的变化而变化。夏时制转换(在文档中提到),leap日和leap秒也有类似的较小的不规律性(Go的time
软件包甚至不考虑leap秒)。
给定两个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中找到了与该链接的链接以及其他信息,该问题与打印人类可读的“ X几个月前”字符串的紧密相关的问题有关。
在下面,您同时在上调用Year()
,Month()
等Time
,并获得它们之间的差异(说明了不同的月份长度)。icza为此回答了另一个问题写出了代码。然后,格式化和存储这些差异是相对容易的部分,并且也可以通过ChannelMeter / iso8601duration的代码Duration
(改编自BrianHicks / finch)来完成。
我不知道总的标准合规性还可能是什么,但这使您非常接近。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句