Time 解析Go中的日期
我正在Go中编写一个服务,它接受作为HTTP请求参数传入的timetstamp并对其进行解析 示例调用是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
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