理解 Go 中的时区解析
Go 中解析时区代码涉及将时区的字符串表示形式转换为相应的 *time .位置对象。然而,在某些场景下,解析结果可能无法准确反映所需的时区。本文探讨了时区解析中的常见问题并提供了解决方案。
问题表述
考虑以下代码:
package main import ( "fmt" "time" ) func main() { now := time.Now() parseAndPrint(now, "BRT") parseAndPrint(now, "EDT") parseAndPrint(now, "UTC") } func parseAndPrint(now time.Time, timezone string) { test, err := time.Parse("15:04:05 MST", fmt.Sprintf("05:00:00 %s", timezone)) if err != nil { fmt.Println(err) return } test = time.Date( now.Year(), now.Month(), now.Day(), test.Hour(), test.Minute(), test.Second(), test.Nanosecond(), test.Location(), ) fmt.Println(test.UTC()) }
运行时这段代码,输出始终显示“[date] 05:00:00 0000 UTC”,无论指定时区。这是因为代码正在解析当前位置的时间,然后将时区显式设置为 UTC。
解决方案:使用 time.Location
来正确处理时区解析,我们需要使用 *time.Location 类型。我们可以使用 time.LoadLocation 从本地时区数据库加载位置,然后使用 time.ParseInLocation 解析时间。修改后的代码如下:
package main import ( "fmt" "time" ) func main() { now := time.Now() parseAndPrint(now, "BRT") parseAndPrint(now, "EDT") parseAndPrint(now, "UTC") } func parseAndPrint(now time.Time, timezone string) { location, err := time.LoadLocation(timezone) if err != nil { fmt.Println(err) return } test, err := time.ParseInLocation("15:04:05 MST", "05:00:00", location) if err != nil { fmt.Println(err) return } fmt.Println(test) }
现在,代码将正确解析时区特定时间并以所需的时区格式打印结果。
以上是为什么 Go 的 time.Parse 无法准确解析时区,如何修复?的详细内容。更多信息请关注PHP中文网其他相关文章!