【问题标题】:Parsing RFC-3339 date string to time.Time [duplicate]将 RFC-3339 日期字符串解析为 time.Time [重复]
【发布时间】:2022-02-23 18:04:20
【问题描述】:

如何将字符串日期格式转换为日期,我的日期字符串格式为:

YYYY-MM-DD 

接下来我尝试了,但没有运气。

t, err := time.Parse("%Y-%m-%d", "2011-01-19")
t, err := time.Parse("YYYY-MM-DD", "2011-01-19")
t, err := time.Parse("2016-01-20", "2011-01-19")

以上所有语句都给出了解析错误。

【问题讨论】:

  • 最后一个例子有效,但是你在2016 中犯了一个错误,应该是2006,而20 应该是02。所以:t, err := time.Parse("2006-01-02", "2011-01-19")

标签: date go


【解决方案1】:

请阅读time.Parse的文档:

布局通过显示参考时间的定义来定义格式

2006 年 1 月 2 日星期一 15:04:05 -0700 MST

如果是值就会被解释;它用作输入格式的示例。然后将对输入字符串进行相同的解释。

所以正确的格式是

t, err := time.Parse("2006-01-02", "2011-01-19")

【讨论】:

    【解决方案2】:

    除了使用文字 2006-01-02 时间格式之外,您还可以通过创建类似于 Go 在 time 包中的做法的常量来减少错误。

    YYYY-MM-DD 格式在RFC-3339 中定义为full-date 如下(顺序调整):

    full-date       = date-fullyear "-" date-month "-" date-mday
    date-fullyear   = 4DIGIT
    date-month      = 2DIGIT  ; 01-12
    date-mday       = 2DIGIT  ; 01-28, 01-29, 01-30, 01-31 based on
                              ; month/year
    

    因此,您可以创建一个如下所示的常量来配合内置的time.RFC3339time.RFC3339Nano 常量。

    const RFC3339FullDate = "2006-01-02"
    

    那么你可以写如下:

    t, err := time.Parse(RFC3339FullDate, "2011-01-19")
    

    这是在mogo/time/timeutil 包中,所以你可以这样写:

    t, err := time.Parse(timeutil.RFC3339FullDate, "2011-01-19")
    

    作为参考,time/format.go 包含以下常量:

    const (
        ANSIC       = "Mon Jan _2 15:04:05 2006"
        UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
        RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
        RFC822      = "02 Jan 06 15:04 MST"
        RFC822Z     = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
        RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
        RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
        RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
        RFC3339     = "2006-01-02T15:04:05Z07:00"
        RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
        Kitchen     = "3:04PM"
        // Handy time stamps.
        Stamp      = "Jan _2 15:04:05"
        StampMilli = "Jan _2 15:04:05.000"
        StampMicro = "Jan _2 15:04:05.000000"
        StampNano  = "Jan _2 15:04:05.000000000"
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 2013-01-21
      • 1970-01-01
      • 2011-08-27
      • 2012-06-10
      相关资源
      最近更新 更多