【问题标题】:time.Parse in Go with varying fractional second lengthtime.Parse 在 Go 中具有不同的小数秒长度
【发布时间】:2019-05-19 03:54:40
【问题描述】:

我正在解析数据库中的时间戳。我的布局如下:

layout = "2006-01-02 15:04:05.000000000 -0700 MST"

pipelineTS, err := time.Parse(layout, rawPipelineTS)

问题是有时小数秒不是9位数,例如:

2018-12-18 15:25:08.73728596 +0000 UTC  

当它找到这样的值时,它会出错。有想法该怎么解决这个吗?时间戳来自数据库表。我需要它取任意数量的小数秒数。

【问题讨论】:

    标签: go time timestamp datetime-parsing


    【解决方案1】:

    来自time 文档:

    小数点后跟一个或多个零表示小数 第二,打印到给定的小数位数。一个小数点 后跟一个或多个 9 表示小数秒,打印 到给定的小数位数,删除尾随零。 解析时(仅),输入可能包含小数秒字段 紧跟在秒字段之后,即使布局没有 表示它的存在。在这种情况下,小数点后跟 最大数字系列被解析为小数秒。

    时间解析:

    1. 如果您未在布局中指定小数秒,time.Parse 仍将在输入中接受它,并具有全分辨率(“最大数字系列”)。 (source)
    2. 如果您指定带有一个或多个零的小数秒,time.Parse 要求输入具有该精确的小数位数。 (source)
    3. 如果您指定带有一个或多个 9 的小数秒,time.Parse 实际上接受 任何数量的小数位数(最多 9 个)。也就是说,行为与您根本没有指定小数秒(案例#1)相同。我认为文档在这一点上根本不清楚,但对于解析(不是格式化),.9.99.999.999999 等都是完全等价的。 (source)

    游乐场样本:https://play.golang.org/p/aXYiaMsCVuz

    【讨论】:

      【解决方案2】:

      Package time

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


      对布局小数秒使用九,而不是零。

      例如,

      package main
      
      import (
          "fmt"
          "time"
      )
      
      func main() {
          layout := "2006-01-02 15:04:05.999999999 -0700 MST"
      
          input := "2018-12-18 15:25:08.73728596 +0000 UTC" // 8 digits
          t, err := time.Parse(layout, input)
          fmt.Println(t, err)
      
          input = "2018-12-18 15:25:08.7372 +0000 UTC" // 4 digits
          t, err = time.Parse(layout, input)
          fmt.Println(t, err)
      
          input = "2018-12-18 15:25:08 +0000 UTC" // 0 digits
          t, err = time.Parse(layout, input)
          fmt.Println(t, err)
      }
      

      游乐场:https://play.golang.org/p/j4WBmz3ENke

      输出:

      2018-12-18 15:25:08.73728596 +0000 UTC <nil>
      2018-12-18 15:25:08.7372 +0000 UTC <nil>
      2018-12-18 15:25:08 +0000 UTC <nil>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-02
        • 1970-01-01
        • 2022-12-17
        • 2021-12-07
        • 2013-09-19
        • 1970-01-01
        相关资源
        最近更新 更多