dongshan9619
2016-10-22 17:59
浏览 181
已采纳

Golang-解析YYYY-MM-DD日期的日期

Hi so I can't seem to find anything to help me on this.

I am using the format string "January 02, 2006" and the time string "2016-07-08"

However when I run a format using these parameters the response I get is July 7th, 2016. The correct response would be July 8th, 2016.

As a note, I am also trying to use this via Sprig.

{{ date "January 02, 2006" .MyDate }}

If I can get any assistance it would be much appreciated

图片转代码服务由CSDN问答提供 功能建议

嗨,所以我似乎找不到任何可以帮助我的东西。

我正在使用格式字符串 “ 2006年1月2日” 和时间字符串 “ 2016-07-08”

但是当我使用这些格式运行格式时 参数,我得到的响应是2016年7月7日。正确的响应是2016年7月8日。

请注意,我也尝试通过Sprig使用它。

  {{date“ January 02,2006” .MyDate}} 
   
 
 

如果我可以得到任何帮助,

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • dongshiru5913 2016-10-22 19:33
    已采纳

    It's because of the time zone, you're getting the right date, but sprig formats to "Local" by default, where golang.org/pkg/time defaults to "UTC"

    Here is a sample code: (omitting error handling for simplicity)

    func main() {
        // using the "time" package
        mydate, _ := time.Parse("2006-01-02", "2016-07-08")
        fmt.Println("time:", mydate.In(time.Local).Format("January 02, 2006 (MST)"), "-- specify Local time zone")
        fmt.Println("time:", mydate.Format("January 02, 2006 (MST)"), "-- defaults to UTC")
    
        d := struct{ MyDate time.Time }{mydate}
    
        //using sprig
        fmap := sprig.TxtFuncMap()
        localTpl := `sprig: {{ date "January 02, 2006 (MST)" .MyDate }} -- defaults to Local`
        t := template.Must(template.New("test").Funcs(fmap).Parse(localTpl))
        var localdate bytes.Buffer
        t.Execute(&localdate, d)
        fmt.Println(localdate.String())
    
        utcTpl := `sprig: {{ dateInZone "January 02, 2006 (MST)" .MyDate "UTC"}} -- specify UTC time zone`
        t = template.Must(template.New("test").Funcs(fmap).Parse(utcTpl))
        var utcdate bytes.Buffer
        t.Execute(&utcdate, d)
        fmt.Println(utcdate.String())
    
    }
    

    Output:

    time:  July 07, 2016 (EDT) -- specify Local time zone                                                                                  
    time:  July 08, 2016 (UTC) -- defaults to UTC                                                                                          
    sprig: July 07, 2016 (EDT) -- defaults to Local                                                                                        
    sprig: July 08, 2016 (UTC) -- specify UTC time zone  
    

    Here is some reference:

    time: https://golang.org/pkg/time

    In the absence of a time zone indicator, Parse returns a time in UTC.

    spig: https://github.com/Masterminds/sprig/blob/master/functions.go#L407

    func date(fmt string, date interface{}) string {
        return dateInZone(fmt, date, "Local")
    }
    

    Note: if you want to format to a specific time zone, look at the 2nd template:

    utcTpl := `sprig: {{ dateInZone "January 02, 2006 (MST)" .MyDate "UTC"}} -- specify UTC time zone`
    
    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • duanbianweng5353 2016-10-22 18:29

    I think the correct way is to send time.Time type to your template and then use Format function on it. You can use ParseTime to parse your 2016-07-08 format.

    type Data struct {
        CreatedOn time.Time
    }
    
    template.Execute(w, Data{})
    

    Template:

    <span>{{ .CreatedOn.Format "January 02, 2006" }}</span>
    
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题