将时间戳转换为golang

时间:2018-12-20 18:40:58

标签: go time iso

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

这是我尝试过的

ts, err := time.Parse(time.RFC3339, currentTime)

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

当心,很长的答案

(tl; dr)使用:

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

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

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

RFC3339 = "2006-01-02T15:04:05Z07:00"
  

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

这意味着您无法使用布局+0000来解析Z07:00

也:

  

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

Mon Jan 2 15:04:05 MST 2006
     

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

01/02 03:04:05PM '06 -0700

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

-0700  ±hhmm
-07:00 ±hh:mm
-07    ±hh

或用Z替换格式中的符号:

Z0700  Z or ±hhmm
Z07:00 Z or ±hh:mm
Z07    Z or ±hh

分数:

从此转到示例https://play.golang.org/p/V9ubSN6gTdG

  

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

do("9s for fraction", "15:04:05.99999999", "11:06:39.1234")

因此您可以将其解析为:

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

另外,来自文档

  

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

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

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

要获取UTC中的时间,只需写ts.UTC()

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

ts.Format(time.RFC3339)

示例

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

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

答案 1 :(得分:1)

怎么样?

getCalendarById

从那时开始。RFC3339只是ts, err := time.Parse("2006-01-02T15:04:05.000+0000", currentTime)