自动时区检测

Automatic Time Zone detection

提问人:HV16 提问时间:11/9/2023 更新时间:11/10/2023 访问量:34

问:

电脑或手机等设备如何获取时区信息以自动设置时钟?

我正在开发一个具有以太网功能的基于微控制器的嵌入式系统,并希望在我的日志文件中使用时间戳。我可以从 SNTP 获取 UTC 时间,但不确定在哪里或如何获取时区信息。

日期时 NTP

评论

1赞 FObersteiner 11/9/2023
通常,时区是用户定义的。你可以根据你的IP地址位置来获取它,但这或多或少是猜测(如果有人使用VPN到其他位置怎么办?移动电话将使用 GNSS 数据而不是 IP,这给出了更准确的结果,因为时区本质上是地理上的。
0赞 Matt Johnson-Pint 11/10/2023
仅供参考 - 这不一定是 Stack Overflow 主题的最佳问题,但无论如何我都会回答它,因为我想不出更合适的 Stack Exchange 站点。

答:

1赞 Matt Johnson-Pint 11/10/2023 #1

有几种方法,我将按大致精度的顺序列出:

手动设定

设备的时区由环境变量或其他机制设置,具体取决于操作系统。这是最常见的方法,也是最准确的方法 - 假设实际拥有设备的人知道它将在哪个时区使用。但是,它确实要求用户在某些配置设置中输入时区,或从列表中选择时区等。通常,该选择是保留的,因此可以在启动时恢复。TZ

全球定位系统/全球导航卫星系统

(全球定位系统/全球导航卫星系统)

具有地理定位功能的设备(如汽车或移动电话)可以利用设备的当前位置根据经纬度坐标确定适当的时区。这通常是一种选择加入的方法,因为有时即使设备能够确定其位置,用户仍然可以选择利用信息来实现此目的。例如,Android 12 及更高版本具有选择启用的基于位置的时区检测功能。

除了位置之外,设备还需要时区地图,或根据地图计算的索引,或使用地图或索引的库。不过,地图可能会固执己见,因为世界各地的边界通常定义不清,有时甚至存在争议。尽管如此,用于此目的的最可靠和最常用的地图之一来自时区边界生成器项目,该项目将时区边界分层在OpenStreetMap数据之上。(事实上,它被前面提到的 Android 功能使用。您可以在此处找到利用此数据的软件库和服务列表。如果您的设备具有 GPS 或其他地理定位功能,则可以从该列表中选择一个库,并在代码中使用它来自动确定时区。

尼茨

(网络标识和时区)

NITZ可用于具有GSM芯片进行移动通信的设备。基本上,这些设备从与之通信的手机信号塔中获取当前时间和时区。时间本身仅在分钟级上准确,因此当时间源可用时,通常会忽略它,而转而使用基于 NTP 的时间源。

根据 NITZ 规范,时区信息仅包含与 UTC 的偏移量,以及指示 DST 调整的标志(如果有)。虽然这对于设置当前本地时间很好,但它可能无法全局唯一标识时区。因此,它可能适合您的需求,也可能不适合您的需求 - 取决于您的设备和软件的性质。有关这一点的更多信息,请阅读时区标签 wiki,尤其是标题为“时区 != 偏移量”的部分。

此外,当多个手机信号塔可以与两个时区边界附近的设备通信时,或者当一个信号塔需要服务于两个不同的时区时,就会出现 NITZ 的一个常见问题。在这种情况下,设备可以接收混合信号,并且可能通过选择错误的时区进行响应,或者可以通过在两个时区之间来回交替进行响应。这种情况通常会导致靠近此类边界的用户禁用自动时区选择,并在可能的情况下(例如在手机上)恢复为手动选择。

然而,NITZ的另一个问题是,时区信息的可靠性取决于移动运营商对手机信号塔的设置。有时,特定手机信号塔可能具有错误的时区设置,或者可能没有最新的时区信息(例如 DST 转换的日期和时间)。然而,这主要是旧蜂窝网络的问题。大多数现代运营商都实现了自动化。

互联网地理定位

有许多机制可以根据用户的 IP 地址猜测用户的大致位置。通常,猜测足够接近,可以选择一个时区,使用与通过 GPS 接收位置相同的方法。但是,位置也可能出错 - 尤其是当设备连接到专用网络或 VPN 时。因此,在这种情况下,使用这种方法设置时区可能会产生不同的结果 - 有时设置当地时间非常不正确。请谨慎使用,尤其是在可能正在移动的设备上。

组合方法

使用上述方法缓解挑战的一种方法是将它们结合起来:

  • 根据设备功能,按准确性顺序使用自动信息。GPS,然后是 NITZ,然后是 IP 地理定位。

  • 允许用户关闭自动选择,并在需要时手动选择时区。

我能给出的最好的例子是 Windows 10 及更高版本的“自动设置时区”功能。禁用后,用户将手动选取时区。启用后,将根据计算机可用的最准确的位置信息选择时区,并利用 Microsoft 随操作系统提供的时区位置数据索引 - 根据需要通过 Windows 更新定期更新。

评论

1赞 Matt Johnson-Pint 11/10/2023
请注意,谷歌搜索 Windows 的自动时区功能将显示大量投诉 - 其中绝大多数是由于设备除了 IP 地理定位功能之外什么都没有引起的。因此,如果您选择该选项,那么您的用户可能会遇到类似的结果。
0赞 HV16 11/10/2023
我想要自动化过程的原因之一是夏令时。使用手动设置时,用户必须每年在时钟切换时重新设置两次时区。我将研究 IP 地理位置,并可能将其与手动设置相结合,以防出现错误。感谢您的详细回答,有很多有用的信息。
0赞 Matt Johnson-Pint 11/13/2023
这是不正确的。对于 DST 转换,需要 tzdb 数据和时区标识符。例如。所有 DST 转换和偏移都包含在单个时区的数据中。用户和代码都不应更改 DST 的时区。America/New_York