提问人:HV16 提问时间:11/9/2023 更新时间:11/10/2023 访问量:34
自动时区检测
Automatic Time Zone detection
问:
电脑或手机等设备如何获取时区信息以自动设置时钟?
我正在开发一个具有以太网功能的基于微控制器的嵌入式系统,并希望在我的日志文件中使用时间戳。我可以从 SNTP 获取 UTC 时间,但不确定在哪里或如何获取时区信息。
答:
有几种方法,我将按大致精度的顺序列出:
手动设定
设备的时区由环境变量或其他机制设置,具体取决于操作系统。这是最常见的方法,也是最准确的方法 - 假设实际拥有设备的人知道它将在哪个时区使用。但是,它确实要求用户在某些配置设置中输入时区,或从列表中选择时区等。通常,该选择是保留的,因此可以在启动时恢复。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 更新定期更新。
评论
America/New_York
评论