Datetime 将UTC字符串转换为时间对象

Datetime 将UTC字符串转换为时间对象,datetime,go,time,Datetime,Go,Time,我有这个约会时间,或者类似的东西 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.Pars

我有这个约会时间,或者类似的东西

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)

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

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

布局必须是此日期/时间,格式为输入时间:

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)
输出(在上尝试):

因此,可以使用它来解析时间,也可以使用它来生成字符串表示,您可以在其中指定布局,这样您就可以使用相同的布局来解析时间字符串

第二轮:


您正在URL中包含时间字符串。
+
符号是URL编码中的一个特殊字符:它表示空格。因此,
+
被转换为空间(因此它从时间字符串中消失)。使用正确的URL编码!查看软件包,然后。

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

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

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

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.Parse(time.RFC3339, <your time.Time object here>)
<time.Time object>.Format(time.RFC3339) //or other type of formats

哈哈,是的。我使用了错误的布局。我不知道该用什么布局。我刚试过“2006-01-02 15:04:05-0700 MST”,但也没用。我想知道是否有人知道该使用什么布局,因为这是一种常见的格式。我真的要去
time.Now()
,把它转换成字符串,然后把它传给解包(编写集成测试)@praks5432你是什么意思?这对你没用?点击我答案中的操场链接,自己试试。我粘贴了
2014-11-17 23:02:03 0000 UTC
,这是
time.Now().String()
(我冻结了时间-用于测试)的输出。我在你的操场
0001-01-01 00:00:00+0000 UTC解析时间“2014-11-17 23:02:03 0000 UTC”中得到了这个错误“2006-01-02 15:04:05-0700 MST”:无法将“UTC”解析为“-0700”
@praks5432您的输入中缺少一个
+
符号,作为区域偏移量的一部分。是的。我知道。我不控制它。我正在传递
时间。Now().String()
。这是Go提供的。我们怎么能在一个包中有一个函数,而不接受同一个包中另一个函数的输出,而这个函数似乎是为协同工作而设计的呢?是的,我理解。但我正在做的是使用
time.Now().String
作为url参数。然后我将该参数解包并尝试转换回时间(这是我正在编写的一个测试)。从
time.Now().String
解包后得到的输出是
2014-11-17 23:02:03 0000 UTC
,未被解析。我知道我的布局错误。我正在尝试查找哪个布局。
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.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"