【问题标题】:Marshal time.Time with decimal place元帅时间。带小数位的时间
【发布时间】:2021-01-12 18:01:00
【问题描述】:

我使用的服务要求时间输入的格式必须始终包含小数位,即使时间本身正好在第二个标记上。

例如:ValueError: time data '2021-01-07T21:09:59Z' does not match format '%Y-%m-%dT%H:%M:%S.%fZ'

我知道默认情况下,json.Marshal 会将time.Time 类型格式化为 RFC3339 格式,所以我尝试为我的结构实现自定义 Marshaler,它首先将时间转换为 RFC3339Nano ("2006-01-02T15:04:05.999999999Z07:00":

func (f *MyStruct) MarshalJSON() ([]byte, error) {
    type Alias MyStruct
    return json.Marshal(&struct {
        *Alias
        Timestring string `json:"time"`
    }{
        Alias: (*Alias)(f),
        Timestring: f.Time.Format(time.RFC3339Nano),
    })
}

但是,我发现 RFC3339Nano 仍然会省略亚秒,如果时间本身正好在第二个标记上。

如果缺少.000,我可以简单地操作字符串以添加它,但我想知道是否有更简洁的方法来实现这一点?

【问题讨论】:

    标签: go time


    【解决方案1】:

    小数点后跟一个或多个零表示小数秒,打印到给定的小数位数。小数点后跟一个或多个 9 表示小数秒,打印到给定的小数位数,去除尾随零。

    https://golang.org/pkg/time/#pkg-constants

    所以使用零而不是九,直到达到所需的精度:

    t := time.Date(2021, 1, 7, 21, 9, 59, 0, time.UTC)
    fmt.Println(t.Format("2006-01-02T15:04:05.000Z07:00")) // 2021-01-07T21:09:59.000Z
    

    在操场上试试看:https://play.golang.org/p/xqFP_2g3jYP

    【讨论】:

      猜你喜欢
      • 2019-05-16
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 2020-05-21
      • 1970-01-01
      • 2013-01-09
      相关资源
      最近更新 更多