【问题标题】:why does time.Parse parse the time incorrectly?为什么 time.Parse 会错误地解析时间?
【发布时间】:2014-06-25 06:45:13
【问题描述】:

我正在尝试parse 一个字符串作为时间,但不幸的是 go 得到了错误的月份(一月而不是六月)

package main

import "fmt"
import "time"

func main() {

    t := "2014-06-23T20:29:39.688+01:00"
    tc, _ := time.Parse("2006-01-02T15:04:05.000+01:00", t)
    
    fmt.Printf("t was %v and tc was %v", t, tc)

}

Play

【问题讨论】:

    标签: time go


    【解决方案1】:

    问题是你的时区偏移在布局中定义不明确:参考偏移是-0700。您将您的定义为+01:00,因此01 被解释为月份并删除先前定义的月份。由于您的工作偏移量也是01,因此它被解析为一月。

    以下示例适用于我playground

    package main
    
    import "fmt"
    import "time"
    
    func main() {
    
        t := "2014-06-23T20:29:39.688+01:00"
        tc, _ := time.Parse("2006-01-02T15:04:05.000-07:00", t)
    
        fmt.Printf("t was %v and tc was %v", t, tc)
    
    }
    

    【讨论】:

    • 如果我将 2006 更改为 2003,它再次解析失败。为什么? play.golang.org/p/mv8kD63O4k
    • 因为年份的字符串是2006
    • 是的,你真的必须使用这个特定的日期来指定日期字符串的格式。这有点奇怪,我认为 YYYY 等使格式化不那么笨拙和容易出错,但事实就是这样。
    【解决方案2】:

    您的布局字符串不正确。布局字符串中的数字具有特殊含义,您使用了两次1:一次在月份部分,一次在时区部分。您正在解析的字符串中的时区是01:00,因此您将1 存储到月份中。这就解释了为什么返回的月份是一月(第一个月)。

    更正后的布局字符串是2006-01-02T15:04:05.000-07:00。或者,如果您对使用 Z 表示 UTC 感到满意,那么 time.RFC3339 常量可能是合适的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 2014-06-26
      • 2018-10-21
      • 2016-11-15
      • 2019-07-20
      相关资源
      最近更新 更多