转载

Golang 1.6: 在text/template中输出RFC3339样式的Time

本文测试环境 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 
原文  https://www.mgenware.com/blog/?p=3100
正文到此结束
Loading...