c-Posix时区字符串到Olson字符串



我们有一个嵌入式Linux系统,用户需要能够通过提供POSIX字符串(例如WEuropeStandardTime-1DaylightTime、M3.5.0、M10.5.0/3(来永久设置系统的时区。

用户通过我们开发的Web服务与系统交互,因此我们可以完全控制实现。我正在寻找一个C/C++解决方案。

我一直在研究timedatectl-set时区,但它只接受Olson时区描述,而不接受POSIX时区字符串。我想我可以解析tzdata来找到POSIZ时区字符串的匹配项,但在开始这条路径之前,我想知道是否有更好的方法,或者是否已经有一个库来进行这种转换。

我不考虑设置TZ环境变量,因为它是timedatectl设置的系统日期和时间的覆盖,感觉就像一个bodge。此外,我不确定我是如何提前设置的,以便所有从启动运行的软件都能看到相同的时间。

你的要求是不可能的。在IANA(又称"Olson"(时区标识符后面表示的数据中有比POSIX时区字符串所能容纳的更多的信息。特别是,POSIX时区字符串只能包含一对转换规则。它没有提供任何设施来跟踪这些规则是如何随着时间的推移而变化的,或者它们在未来可能会如何变化。它也没有提供标准时间偏移发生变化的情况,或者一年中有多对转换的情况。您可以在"POSIX风格的时区">指向时区标签wiki的底部。

然而,由于您说用户通过web服务与系统交互,因此您可能会考虑投影POSIX字符串。用户会为设备选择一个IANA时区(或者你可以按位置查找(,然后你会存储它。然后,当与设备通信时,您将生成一个POSIX字符串,以便在给定的时间段内在设备上使用。你可能想定期更新它,也许每次设备登录或更新时(取决于你的情况(。

据我所知,有一个内置此功能的商业产品:Azure地图时区API。在它的响应中,您将看到一个PosixTz字符串。(这是专门为物联网场景添加的。(

或者,您可以在自己的服务器端代码中自己完成此操作。逻辑有点复杂,但这确实是可能的。

  • 如果你的后端是.NET,那你就很幸运了。我的TimeZoneConverter.Posix库可以为您做到这一点。例如:

    string posix = PosixTimeZone.FromIanaTimeZoneName("Australia/Sydney");
    // Result: "AEST-10AEDT,M10.1.0,M4.1.0/3"
    
  • 如果你的后端是JavaScript,那么Moment Timezone第314期中有一些不受支持的代码,你可以利用或调整。

  • 如果你的后端是其他东西,我不知道有现成的解决方案。但是,您可以将上述任意一个中的代码移植到您的平台。

最新更新