【问题标题】:Convert UTC string to time object将 UTC 字符串转换为时间对象
【发布时间】:2016-12-12 09:20:27
【问题描述】:

我有这个日期时间,或者类似的东西。

2014-11-17 23:02:03 +0000 UTC

我想将其转换为时间对象,但我无法从 time.Parse 生成任何输出,除了:

0001-01-01 00:00:00 +0000 UTC

我试过这些布局:

time.RFC3339
0001-01-01 00:00:00 0000 UTC
2016-10-10
time.UnixDate

还有一些 - 没有一个有效。

这就是我打电话给parse 的方式:

updatedAt, err := time.Parse(time.UnixDate, updatedAtVar)

如何从字符串创建时间对象?

【问题讨论】:

    标签: datetime go time


    【解决方案1】:

    还没有看到这个,但对于那些不知道格式的人来说,时间将格式内置为常量。因此您可以在解析或格式化时引用它们。

    time.Parse(time.RFC3339, <your time.Time object here>)
    <time.Time object>.Format(time.RFC3339) //or other type of formats
    

    仅供参考

    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"
    

    【讨论】:

      【解决方案2】:

      很可能您使用了错误的布局,并且您没有检查返回的错误。

      布局必须是这个日期/时间,格式为您输入的时间:

      Mon Jan 2 15:04:05 -0700 MST 2006
      

      查看此工作代码:

      layout := "2006-01-02 15:04:05 -0700 MST"
      t, err := time.Parse(layout, "2014-11-17 23:02:03 +0000 UTC")
      fmt.Println(t, err)
      

      输出(在Go Playground 上试试):

      2014-11-17 23:02:03 +0000 UTC <nil>
      

      编辑:

      在您的问题中,您在输入时间中包含了+ 符号(作为区域偏移的一部分),但您在其他格式的时间中存在错误。

      Time.String() 使用以下格式字符串:

      "2006-01-02 15:04:05.999999999 -0700 MST"
      

      因此,要么使用它来解析时间,要么使用Time.Format() 生成您可以指定布局的字符串表示,这样您就可以使用相同的布局来解析时间字符串。

      第二轮:

      您将时间字符串包含在 URL 中。 + 符号是 URL 编码中的一个特殊字符:它表示空格。因此+ 被转换为空间(因此它从您的时间字符串中消失)。使用正确的 URL 编码!查看net/url 包和this example

      【讨论】:

      • 大声笑..是的。我使用了错误的布局。我不知道要使用什么布局。我刚试过"2006-01-02 15:04:05 -0700 MST",也没有用。想知道是否有人知道要使用什么布局,因为这是一种常见的格式。我真的要去time.Now(),将其转换为字符串,并将其传递给解包(编写集成测试)
      • @praks5432 你是什么意思?它不适合你吗?单击我的答案中的 Playground 链接并自己尝试。
      • 我粘贴在2014-11-17 23:02:03 0000 UTC 中,这是time.Now().String() 的输出(我冻结了时间 - 进行测试)我在您的操场上收到此错误0001-01-01 00:00:00 +0000 UTC parsing time "2014-11-17 23:02:03 0000 UTC" as "2006-01-02 15:04:05 -0700 MST": cannot parse "UTC" as "-0700"
      • @praks5432 您的输入中缺少+ 符号,作为区域偏移的一部分。
      • 是的。我知道。我不控制那个。我正在传递time.Now().String()。那是从围棋。我们如何才能在一个包中拥有一个函数,而该函数不会从同一个包中的另一个函数的输出中获取似乎被设计为协同工作的功能?
      【解决方案3】:

      您可能使用了错误的布局。正如time.Parse 中所述,您需要指定一个布局,以帮助 Go 理解作为输入传递的日期是如何格式化的。

      有预定义的布局(如您使用的布局),但没有一个与您的输入匹配。因此,您需要定义自定义布局。

      布局使用以下日期作为参考:

      Mon Jan 2 15:04:05 MST 2006
      

      布局只是该日期的表示,与您输入的表示相匹配:

      t, err := time.Parse("2006-01-02 15:04:05 -0700 MST", "2014-11-17 23:02:03 +0000 UTC")
      

      还记得检查err 是否有错误。很可能您的尝试返回了错误,但您没有检查它。

      package main
      
      import (
          "fmt"
          "log"
          "time"
      )
      
      func main() {
          t, err := time.Parse("2006-01-02 15:04:05 -0700 UTC", "2014-11-17 23:02:03 +0000 UTC")
          if err != nil {
              log.Fatalln(err)
          }
          fmt.Println(t)
      }
      

      【讨论】:

      • 是的,我明白了。但我正在做的是使用time.Now().String 作为url 参数。然后我解压缩该参数并尝试转换回时间(这是我正在编写的测试)。我从time.Now().String 解包后得到的输出是2014-11-17 23:02:03 0000 UTC,它没有被解析。我知道我的布局错误。我正在尝试查找哪种布局。
      猜你喜欢
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      相关资源
      最近更新 更多