为什么 运行 Golang 的 time.Now() 在 OpenWRT 总是得到 UTC 时间?

Why running Golang's time.Now() at OpenWRT always get UTC time?

我在 OpenWRT 上写了一个 运行 的 Golang 程序。

package main

import (
    "fmt"
    "time"
)

func main(){
    fmt.Println(time.Now())
}

当我在我的 Macbook 上 运行 这个程序时,我总是得到正确的本地时间。

然而,当 运行在 OpenWRT 上运行这个程序时,我总是得到 UTC 时间。

我设置了OpenWRT的时区和时间。当我执行 uci show system 时,我可以看到正确的时区。当我执行 date 时,可以正确显示正确的本地时间。

所以我的问题是,如何在 OpenWRT 上使用 Golang 的 time.Now() 获得正确的本地时间?

OpenWRT 将时区存储在名为 /etc/TZ 的文件中。如果此文件丢失或为空,OpenWRT 假定本地时间等于 UTC 时间。 Source

how do I get the correct local time using Golang's time.Now() on OpenWRT?

Specifying the Time Zone with TZ

这是您必须添加或减去本地时间以获得 UTC 时间的值。如果本地时区位于本初子午线以西,则此偏移量将为正,如果为东,则为负。

我的问题的根源是我的 OpenWRT 缺少 zoneinfo 包。所以我先运行opkg update && opkg install zoneinfo-xxx

这是 go/src/time/zoneinfo_unix 的一部分。go:

func initLocal() {
    // consult $TZ to find the time zone to use.
    // no $TZ means use the system default /etc/localtime.
    // $TZ="" means use UTC.
    // $TZ="foo" means use /usr/share/zoneinfo/foo.

    ...

}

根据这个文件,如果没有"TZ"变量,Golang在调用time.Now()时会使用/etc/localtime指向的时区。

然后我将时区设置在 /etc/config/system(选项 zonename 'xxxxxx')和 运行 /etc/init.d/system restart。终于可以得到正确的time.Now().