Time 解析Go中的日期

Time 解析Go中的日期,time,go,Time,Go,我正在Go中编写一个服务,它接受作为HTTP请求参数传入的timetstamp并对其进行解析 示例调用是GET/values?from=2015-02-11T15:01:00+00:00 传递到函数中的值示例为2015-02-11T15:01:00+00:00 我试图这样分析它: dateTime := request.URL.Query.Get("from") layout := "2006-01-02T15:04:05Z07:00" formattedTime, _ := time.Pars

我正在Go中编写一个服务,它接受作为HTTP请求参数传入的timetstamp并对其进行解析

示例调用是
GET/values?from=2015-02-11T15:01:00+00:00

传递到函数中的值示例为
2015-02-11T15:01:00+00:00

我试图这样分析它:

dateTime := request.URL.Query.Get("from")
layout := "2006-01-02T15:04:05Z07:00"
formattedTime, _ := time.Parse(layout, dateTime)
(我正在使用Go的布局编号来执行此操作-此处有更多信息:)

但是,此操作的输出为
0001-01-01 00:00:00+0000 UTC

我还应该指出,当我执行
fmt.Println(dateTime)
时,我会得到
2015-02-11T15:01:00:00
(而不是像我预期的那样
2015-02-11T15:01:00+00:00

另外,当我将日期时间硬编码到函数中并使用time.parse(布局,日期时间)解析它时,它被成功解析并给出输出
2015-02-11 15:01:00+000 GMT

有人知道这里会发生什么吗

谢谢


肖恩

您应该检查返回的错误
time.Parse()
返回一个错误:

formattedTime, err := time.Parse(layout, dateTime)
if err != nil {
    fmt.Println(err)
}
您的错误将出现在URL查询中的
'+'
字符中。URL查询在
+
符号特殊的地方使用:它用于编码空格字符。所以当你这样做的时候:

dateTime := request.URL.Query.Get("from")
您的
dateTime
将包含解码的值,其中
+
将被一个空格替换。检查它,如:

fmt.Printf("%q\n", dateTime)
输出:

"2015-02-11T15:01:00 00:00"
当然,对于您指定的布局,这不是有效的格式,这将导致以下错误:

解析时间“2015-02-11T15:01:00:00”为“2006-01-02T15:04:05Z07:00”:无法将“”解析为“Z07:00”

您必须在URL查询中使用
%2B
,这是
+
符号的代码,并且还必须包括布局中使用的
Z
字符:

GET /values?from=2015-02-11T15:01:00Z%2B00:00
还要注意,布局必须包含
-07:00
参考时区,而不是
07:00

layout := "2006-01-02T15:04:05Z-07:00"
然后输出(
formattedTime
):

请在以下网站上试用:

如果必须在查询中使用
+
。。。 如果您必须使用
+
查询(如您在注释中所声明的),那么使用未经转换的值将是一件棘手的事情,因为如果查询中的时区是
+
,它将被替换为空格,但如果时区是
-
,则不是

一种方法是使用原始查询,而不是解码查询。这可以在
URL.RawQuery
中找到

这里的解决方案假定只有一个请求参数:
“from=“
”。如果存在其他问题,则会失败,请考虑:

param := "from="
layout := "2006-01-02T15:04:05-07:00"
length := len(param) + len(layout)

if s := request.URL.RawQuery; len(s) < length || !strings.HasPrefix(s, param) {
     // unexpected query
}
dateTime := request.URL.RawQuery[len(param):length]
formattedTime, err := time.Parse(layout, dateTime)
if err != nil {
    // handle error
}
param:=“from=”
布局:=“2006-01-02T15:04:05-07:00”
长度:=长度(参数)+长度(布局)
如果s:=request.URL.RawQuery;len(s)
您应该检查返回的错误
time.Parse()
返回一个错误:

formattedTime, err := time.Parse(layout, dateTime)
if err != nil {
    fmt.Println(err)
}
您的错误将出现在URL查询中的
'+'
字符中。URL查询在
+
符号特殊的地方使用:它用于编码空格字符。所以当你这样做的时候:

dateTime := request.URL.Query.Get("from")
您的
dateTime
将包含解码的值,其中
+
将被一个空格替换。检查它,如:

fmt.Printf("%q\n", dateTime)
输出:

"2015-02-11T15:01:00 00:00"
当然,对于您指定的布局,这不是有效的格式,这将导致以下错误:

解析时间“2015-02-11T15:01:00:00”为“2006-01-02T15:04:05Z07:00”:无法将“”解析为“Z07:00”

您必须在URL查询中使用
%2B
,这是
+
符号的代码,并且还必须包括布局中使用的
Z
字符:

GET /values?from=2015-02-11T15:01:00Z%2B00:00
还要注意,布局必须包含
-07:00
参考时区,而不是
07:00

layout := "2006-01-02T15:04:05Z-07:00"
然后输出(
formattedTime
):

请在以下网站上试用:

如果必须在查询中使用
+
。。。 如果您必须使用
+
查询(如您在注释中所声明的),那么使用未经转换的值将是一件棘手的事情,因为如果查询中的时区是
+
,它将被替换为空格,但如果时区是
-
,则不是

一种方法是使用原始查询,而不是解码查询。这可以在
URL.RawQuery
中找到

这里的解决方案假定只有一个请求参数:
“from=“
”。如果存在其他问题,则会失败,请考虑:

param := "from="
layout := "2006-01-02T15:04:05-07:00"
length := len(param) + len(layout)

if s := request.URL.RawQuery; len(s) < length || !strings.HasPrefix(s, param) {
     // unexpected query
}
dateTime := request.URL.RawQuery[len(param):length]
formattedTime, err := time.Parse(layout, dateTime)
if err != nil {
    // handle error
}
param:=“from=”
布局:=“2006-01-02T15:04:05-07:00”
长度:=长度(参数)+长度(布局)
如果s:=request.URL.RawQuery;len(s)
您需要在时区偏移之前使用减号,因此布局应为:“2006-01-02T15:04:05-07:00”

:

例如:

打印时,它使用默认格式,而不是用于解析它的格式,因为它调用String方法:


要使用自定义格式对其进行格式化,请使用格式:

您需要在时区偏移之前使用减号,因此布局应为:“2006-01-02T15:04:05-07:00”

:

例如:

打印时,它使用默认格式,而不是用于解析它的格式,因为它调用String方法:


要使用自定义格式格式化,请使用格式:

谢谢,伙计们!啊,我明白了-不幸的是,我需要在http请求中使用格式
GET/values?from=2015-02-11T15:01:00+00:00
!是否建议从查询字符串中读入未编码的值并尝试解析它?@Seán查看我编辑的答案。一种方法是处理
+
-
时区,因为它们的解码方式不同。另一种方法是提取pa