在Go中以不同的分数秒长度进行解析

时间:2018-12-18 17:10:23

标签: go time timestamp datetime-parsing

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

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  

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

2 个答案:

答案 0 :(得分:6)

  

Package time

     

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


在布局小数秒中使用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>

答案 1 :(得分: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