确定当前的主机位置,例如欧洲/伦敦

时间:2017-11-14 03:05:06

标签: go

我正在开发一个将在我们用户的服务器上运行的客户端应用程序。我想猜一下当前的位置,例如America / New_York或Europe / London转发到服务,以便它可以根据UTC偏移和夏令时规则计算客户端的当前时间。

有关应用如何最好地猜测当前位置的任何想法?我知道我可以获得像“PST”这样的当前时区,但这并没有告诉我我需要知道什么。

1 个答案:

答案 0 :(得分:2)

在Ubuntu(可能还有其他Linux发行版)上,/etc/timezone包含位置描述(例如Australia/Sydney),如果在设置服务器时设置了该位置。正如评论中所提到的,不能保证这是正确的。

如果您有互联网访问权限,您可以向https://freegeoip.net/json/或类似的东西发出GET请求,这将返回包含您的IP地理定位数据的json对象。同样,有很多事情可能会影响其准确性。

以下代码执行这两项操作,请注意,为简洁起见,没有错误检查(这很糟糕)。

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

type LocationData struct {
    IP          string  `json:"ip"`
    CountryCode string  `json:"country_code"`
    CountryName string  `json:"country_name"`
    RegionCode  string  `json:"region_code"`
    RegionName  string  `json:"region_name"`
    City        string  `json:"city"`
    ZipCode     string  `json:"zip_code"`
    TimeZone    string  `json:"time_zone"`
    Latitude    float64 `json:"latitude"`
    Longitude   float64 `json:"longitude"`
    MetroCode   int     `json:"metro_code"`
}

func main() {
    // Using /etc/timezone
    buf, _ := ioutil.ReadFile("/etc/timezone")
    fmt.Printf("%s", buf)

    // Using freegeoip
    var locationData LocationData

    resp, _ := http.Get("https://freegeoip.net/json/")
    defer resp.Body.Close()

    decoder := json.NewDecoder(resp.Body)
    decoder.Decode(&locationData)

    fmt.Println(locationData.TimeZone)
}