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

时间:2019-01-04 08:26:09

标签: go openwrt

我编写了一个在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()获得正确的本地时间?

2 个答案:

答案 0 :(得分:4)

我的问题的根源是我的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(选项区域名'xxxxxx')并运行/etc/init.d/system restart。最后,我可以得到正确的时间。Now()。

答案 1 :(得分:3)

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

  

如何使用Golang的time.Now()获取正确的本地时间   OpenWRT?

Specifying the Time Zone with TZ

这是您必须添加到本地时间或从本地时间中减去以获取UTC时间的值。如果当地时区在本初子午线以西,则此偏移量将为正,如果在东部时区,则此偏移量将为负。