解组格式错误的日期时间

问题描述 投票:10回答:2

背景

我正在学习Go,并且正在尝试对日期时间进行JSON解组。

我有一个用C编写的程序生成的JSON,我输出的是我认为有效的ISO8601 / RFC3339时区偏移量。我正在使用strftime和以下格式字符串:

strftime

((请注意,%Y-%m-%dT%H:%M:%S.%f%z 本身不支持%f,我有一个包装器将其替换为纳秒)。

然后将产生以下结果:

strftime

然而,在Go中取消编组将不起作用:strftime

2016-08-08T21:35:14.052975+0200

输出:

https://play.golang.org/p/vzOXbzAwdW

(工作示例:package main import ( "fmt" "time" ) func main() { t, err := time.Parse(time.RFC3339Nano, "2016-08-08T21:35:14.052975+0200") if err != nil { panic(err) } fmt.Println(t) }

这是因为panic: parsing time "2016-08-08T21:35:14.052975+0200" as "2006-01-02T15:04:05.999999999Z07:00": cannot parse "+0200" as "Z07:00" 带有https://play.golang.org/p/5xcM0aHsSw,但是RFC3339 expects the timezone offset to be in the format 02:00将其输出为02:00

因此,我需要在C程序中修复此问题,以输出正确的格式。

:

问题

但是,现在我有一堆格式不正确的JSON文件:

strftime

而不是正确的(在时区偏移中为strftime:]

0200

但是我仍然希望能够在我的Go程序中正确解组它。最好两个具有此区别的不同JSON文件应该以完全相同的方式进行解析。

关于封送回JSON,应使用正确的格式。

这是我在 %z The +hhmm or -hhmm numeric timezone (that is, the hour and minute offset from UTC). (SU) 中定义的方式:

2016-08-08T21:35:14.052975+0200

所以问题是,执行此操作的“执行”方式是什么?

同样在我的代码示例中,我正在使用:。我还要如何在结构的元数据中指定它?就像我现在只用2016-08-08T21:35:14.052975+02:00 一样,它会忽略纳秒吗?

json datetime go iso8601 rfc3339
2个回答
17
投票

您可以定义自己的同时支持两种格式的struct字段类型:

Time            time.Time `json:"time"`

RFC3339Nano

在上面的示例中,我们采用预定义格式json:"time",其定义如下:

time

并删除type MyTime struct { time.Time } func (self *MyTime) UnmarshalJSON(b []byte) (err error) { s := string(b) // Get rid of the quotes "" around the value. // A second option would be to include them // in the date format string instead, like so below: // time.Parse(`"`+time.RFC3339Nano+`"`, s) s = s[1:len(s)-1] t, err := time.Parse(time.RFC3339Nano, s) if err != nil { t, err = time.Parse("2006-01-02T15:04:05.999999999Z0700", s) } self.Time = t return } type Test struct { Time MyTime `json:"time"` }

Try on Go Playground

time.RFC3339Nano使用的这种时间格式在这里描述:RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"

另请参见:的文档"2006-01-02T15:04:05.999999999Z0700"

P.S。在时间格式字符串中使用年份time.Parse的事实可能是因为Golang的第一版于该年发布。


-2
投票

您可以尝试https://golang.org/pkg/time/#pkg-constants

包主导入(“ fmt”“时间”)func main(){t,err:= time.Parse(“ 2006-01-02T15:04:05.999999999Z0700”,“ 2016-08-08T21:35:14.052975-0200”)如果err!= nil {恐慌}fmt.Println(t)}
© www.soinside.com 2019 - 2024. All rights reserved.