为什么 运行 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().
我在 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().