将时间戳转换为golang中的ISO格式

use*_*932 2 time iso go

我正在尝试将时间戳2018-12-17T15:03:49.000 + 0000转换为golang中的ISO格式,但出现错误 cannot parse "+0000" as "Z07:00"

这是我尝试过的

ts, err := time.Parse(time.RFC3339, currentTime)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

ore*_*ren 5

当心,未来还有很长的路要走

(tl; dr)使用:

ts, err := time.Parse("2006-01-02T15:04:05-0700", currentTime)
ts.Format(time.RFC3339)
Run Code Online (Sandbox Code Playgroud)

我真的很喜欢go文档,您应该:)

全部来自https://golang.org/pkg/time/#pkg-constants

RFC3339 = "2006-01-02T15:04:05Z07:00"
Run Code Online (Sandbox Code Playgroud)

某些有效的布局对于time.Parse来说是无效的时间值,这是因为格式,例如_表示空格填充,Z表示区域信息

这意味着您无法+0000使用layout进行解析Z07:00

也:

布局中使用的参考时间是特定时间:

Mon Jan 2 15:04:05 MST 2006
Run Code Online (Sandbox Code Playgroud)

这是Unix时间1136239445。由于MST是GMT-0700,因此参考时间可以认为是

01/02 03:04:05PM '06 -0700
Run Code Online (Sandbox Code Playgroud)

您可以按以下方式解析数字时区偏移量格式:

-0700  ±hhmm
-07:00 ±hh:mm
-07    ±hh
Run Code Online (Sandbox Code Playgroud)

或将格式中的符号替换为Z

Z0700  Z or ±hhmm
Z07:00 Z or ±hh:mm
Z07    Z or ±hh
Run Code Online (Sandbox Code Playgroud)

分数:

从这个例子中https://play.golang.org/p/V9ubSN6gTdG

//如果布局中的分数为9s,则尾随零将被丢弃。

do("9s for fraction", "15:04:05.99999999", "11:06:39.1234")
Run Code Online (Sandbox Code Playgroud)

因此,您可以将其解析为:

ts, err := time.Parse("2006-01-02T15:04:05.999-0700", currentTime)
Run Code Online (Sandbox Code Playgroud)

另外,从文档

小数点后跟一个或多个零表示小数秒,打印到给定的小数位数。小数点后跟一个或多个9代表小数秒,打印到给定的小数位数,并删除了尾随的零。解析时(仅),即使布局不 表示其存在,输入也可能在秒字段之后紧跟着一个小数秒字段。在那种情况下,小数点后跟一个最大的数字序列被解析为小数秒。

这意味着您可以忽略布局中的小数点,它将正确解析

ts, err := time.Parse("2006-01-02T15:04:05-0700", currentTime)
Run Code Online (Sandbox Code Playgroud)

为了节省时间,UTC只需写ts.UTC()

并将其格式化为RFC3339,您可以使用

ts.Format(time.RFC3339)
Run Code Online (Sandbox Code Playgroud)

currentTime := "2018-12-17T17:02:04.123+0530"
ts, err := time.Parse("2006-01-02T15:04:05-0700", currentTime)
if err != nil {
    panic(err)
}

fmt.Println("ts:        ", ts)
fmt.Println("ts in utc: ", ts.UTC())
fmt.Println("RFC3339:   ", ts.Format(time.RFC3339))


// output
// ts:         2018-12-17 17:02:04.123 +0530 +0530
// ts in utc:  2018-12-17 11:32:04.123 +0000 UTC
// RFC3339:    2018-12-17T17:02:04+05:30
Run Code Online (Sandbox Code Playgroud)

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


jcf*_*wer 3

这个怎么样?

ts, err := time.Parse("2006-01-02T15:04:05.000+0000", currentTime)
Run Code Online (Sandbox Code Playgroud)

从那时起。RFC3339 只是2006-01-02T15:04:05Z07:00

  • 不完全是,该文档说明了如何指定自定义布局。如果您尝试解析例如“2018-12-17T15:03:49.000+0100”。它会破裂。你可以检查我的答案,我试图说清楚,因为我自己刚刚学习这些东西。最后,go doc 非常详细,大部分答案都来自那里:) (2认同)