如何从互联网上获取当地时间

网络工程 互联网 ntp
2021-07-18 23:39:19

我正在为嵌入式设备编程,我希望它显示本地时间。我知道我可以通过 NTP 或 SNTP 获取 UTC 时间。但是,如果我不希望用户手动输入时区,如何将其转换为当地时间?显然,我需要一种可以从网络获取时区的方法。是否有任何网络协议可以做到这一点?如果这种方法存在,它可靠吗?

我正在为没有操作系统的嵌入式设备编程。因此我需要“低级”方法,例如协议而不是 Windows 函数。

非常感谢你。

3个回答

没有这样的协议,但您可以进行 GeoIP 查找以获取您的大致位置并将该位置映射到时区。

MaxMind 提供了一个可以通过各种方法访问的 GeoIP 数据库,请参阅http://dev.maxmind.com您甚至可以在 CSV 文件中获取数据并存储在本地,但鉴于您使用的是嵌入式设备,我怀疑您的存储空间不足,可能更喜欢仅进行在线查找。他们有一个方便的 API 可以查找请求者的 IP 地址,因此您无需使用任何其他方法来查找您的外部地址。此外,返回的数据包括时区信息,因此您似乎可以通过单个 HTTP 调用获得所需的一切。https://www.maxmind.com/en/locate-my-ip-address

我把几行 Python 放在一起来展示它是如何工作的:

#!/usr/bin/env python

import urllib, json
url = "https://js.maxmind.com/geoip/v2.1/city/me?referrer=https%3A%2F%2Fwww.maxmind.com"
response = urllib.urlopen(url)
data = json.loads(response.read())
print data['location']['time_zone']
# to pretty print all returned data
#print json.dumps(data, sort_keys=True, indent=4, separators=(',', ': '))

当运行时:

kll $ python ip2tz.py
Europe/Stockholm

缓存结果可能是明智的,这样即使您的 Internet 连接中断,您也可以获得时区。

@kll 给出的答案可能是您能做的最好的答案,尽管由于 IPv4 地址短缺,地理位置一直在恶化,因为一些用户正在使用分配给其他大陆的 RIR 的地址。我知道至少有一家公司将只使用 ARIN(北美)地址进行寻址,而不管站点在世界任何地方的位置如何,因为某些地区的站点会根据地理位置被阻止。

最可靠的方法是使用 GPS,但这在室内可能会出现问题,并且您的设备需要额外的硬件。从积极的方面来说,它也会为您提供最准确的时间。

你可以

  1. 通过 NTP 获取世界时
  2. 在地理定位数据库中查找设备 IP 地址(如果在客户端上实现,请记住从 Internet 上的服务器获取公共 IP,而不是使用本地私有 IP)以获取 TZ ID。
  3. 在 TZ 数据库中查找 TZ ID 以获取该时区的规则。
  4. 将这些时间转换为当地时间。

然而,这种方法存在一些问题。

首先是网络边界并不总是与政治或时区边界一致。这在美国和加拿大等具有多个时区的国家/地区尤其令人担忧。

第二个是在可能内存有限的无操作系统嵌入式设备上本地实现此过程将是困难的。geoip 和 TZ 数据库并不小。

三是geoip和TZ数据库都需要定期更新,可能滞后于现实。

如果您的嵌入式设备与某种服务器通信,我会考虑在服务器端实现大型和 volalite 数据库的负担较小的事物。

我个人建议只使用地理定位数据来设置初始默认值。这避免了系统在没有明显原因的情况下无意中跳过时区。