【问题标题】:How to format Duration如何格式化持续时间
【发布时间】:2016-06-23 02:12:37
【问题描述】:

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

【问题讨论】:

  • @icza 那里的答案很好——修改了这个以链接到您的答案,并链接到链接到另一个答案中的库。我认为提出的问题只是足以保持两者的不同(ISO 句点格式与人类可读的“X 时间前”),但如果人们想标记欺骗,一切都很好。显然,答案的核心算法(计算日历周期)是相同的。

标签: date go iso8601


【解决方案1】:

如果您只有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 个月前”字符串的密切相关问题有关。

在下面,您在两个Times 上调用Year()Month() 等,并了解它们的差异(考虑到不同的月份长度)。 icza wrote out code for that answering that other question。然后格式化和存储这些差异是相对容易的部分,也可以通过例如ChannelMeter/iso8601durationDuration(改编自 BrianHicks/finch)。

我不知道在完全符合标准方面可能还有什么缺点,但这让你非常接近。

【讨论】:

  • github.com/rickb777/date/period 是一颗宝石
猜你喜欢
  • 2019-07-13
  • 2023-03-07
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-21
  • 2019-08-19
  • 2015-09-10
相关资源
最近更新 更多