首页 >后端开发 >Golang >为什么 Go 的 time.Parse 无法准确解析时区,如何修复?

为什么 Go 的 time.Parse 无法准确解析时区,如何修复?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-27 17:55:11363浏览

Why Does Go's `time.Parse` Fail to Accurately Parse Time Zones, and How Can This Be Fixed?

理解 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn