如何在Go中构造time.Time与时区偏移

时间:2019-02-06 11:05:14

标签: go time timezone timezone-offset

这是来自Apache日志的示例日期:

[07/Mar/2004:16:47:46 -0800]

我已经成功地将其解析为year(int),month(time.Month),day(int),hour(int),minute(int),second(int)和timezone(string)。

如何构造time.Time,使其包含-0800时区偏移量?

这是我到目前为止所拥有的:

var nativeDate time.Time
nativeDate = time.Date(year, time.Month(month), day, hour, minute, second, 0, ????)

我应该用什么来代替????time.Localtime.UTC在这里不合适。

1 个答案:

答案 0 :(得分:1)

您可以使用time.FixedZone()来构建具有固定偏移量的time.Location

示例:

loc := time.FixedZone("myzone", -8*3600)
nativeDate := time.Date(2019, 2, 6, 0, 0, 0, 0, loc)
fmt.Println(nativeDate)

输出(在Go Playground上尝试):

2019-02-06 00:00:00 -0800 myzone

如果区域偏移量为字符串,则可以使用time.Parse()进行解析。使用仅包含参考区域偏移量的布局字符串:

t, err := time.Parse("-0700", "-0800")
fmt.Println(t, err)

这将输出(在Go Playground上尝试):

0000-01-01 00:00:00 -0800 -0800 <nil>

如您所见,结果time.Time的区域偏移为-0800小时。

所以我们的原始示例也可以写成:

t, err := time.Parse("-0700", "-0800")
if err != nil {
    panic(err)
}

nativeDate := time.Date(2019, 2, 6, 0, 0, 0, 0, t.Location())
fmt.Println(nativeDate)

输出(在Go Playground上尝试):

2019-02-06 00:00:00 -0800 -0800