本文测试环境 Golang 1.6
Go中的 time.Time
在JSON Marshal
时默认输出样式是RFC3339(Go中用的是 RFC3339Nano
常量),而在使用 text/template
输出时则会使用系统本地样式,比如这段代码,首先创建一个包含 time.Time
的类型:
type MyClass struct { Time time.Time }
然后分别输出JSON和Template的结果:
now := time.Now() // 输出JSON obj := &MyClass{Time: now} b, err := json.Marshal(&obj) if err != nil { panic(err) } fmt.Println(string(b)) // 输出Template t := template.Must(template.New("test").Parse("Time: {{.Time}}")) buffer := &bytes.Buffer{} err = t.Execute(buffer, obj) if err != nil { panic(err) } fmt.Println(buffer.String())
可能的输出:
{"Time":"2016-05-15T12:46:22.601158026+08:00"} Time: 2016-05-15 12:46:22.601158026 +0800 CST
为了使Template的输出和JSON一样,两种方法,第一种是可以手动用另一个变量来存储格式化成RFC3339,使用 Time
对象的 Format
方法,然后在Template中使用这个变量:
now := time.Now() timeStr := now.Format(time.RFC3339Nano) fmt.Println(timeStr)
输出:
2016-05-15T13:02:40.964514785+08:00
另一种方法是在Template上做手脚,直接在属性字段后调用 Format
方法然后传入 time.RFC3339Nano
的值,所以把上面的Template生成代码改成这样就可以:
t := template.Must(template.New("test").Parse("Time: {{.Time.Format /"2006-01-02T15:04:05.999999999Z07:00/"}}"))
将会输出:
{"Time":"2016-05-15T13:02:40.964514785+08:00"} Time: 2016-05-15T13:02:40.964514785+08:00