C Posix时区字符串到奥尔森字符串
我们有一个嵌入式Linux系统,用户需要能够通过提供POSIX字符串(例如WEuropeStandardTime-1DaylightTime、M3.5.0、M10.5.0/3)来永久设置系统的时区 用户通过我们开发的Web服务与系统交互,因此我们可以完全控制实现。我正在寻找一个C/C++解决方案 我一直在研究timedatectl-set时区,但它只接受Olson时区描述,不接受POSIX时区字符串。我想我可以解析tzdata以找到与POSIZ时区字符串匹配的数据,但在开始该路径之前,我想知道是否有更好的方法,或者是否已经有一个库来进行此转换C Posix时区字符串到奥尔森字符串,c,linux,timezone,tdatetime,C,Linux,Timezone,Tdatetime,我们有一个嵌入式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风格时区”一节中了解更多信息
但是,由于您说用户通过Web服务与系统交互,您可能需要考虑投影POSIX字符串。用户会为设备选择一个IANA时区(或者你也可以),然后你将其存储起来。然后,在与设备通信时,您将生成一个POSIX字符串,以便在给定的时间段内在设备上使用。您可能希望定期更新它,可能是每次设备签入或更新时(取决于您的场景)
我知道有一个内置了这种功能的商业产品:the。在它的响应中,您将看到一个PosixTz
字符串。(这是专门针对物联网场景添加的。)
或者,您可以在自己的服务器端代码中自己完成这项工作。逻辑有点复杂,但确实是可能的
- 如果您的后端是.NET,那么您很幸运。我的图书馆可以为你做这件事。例如:
string posix=PosixTimeZone.FromIanaTimeZoneName(“澳大利亚/悉尼”); //结果:“AEST-10AEDT,M10.1.0,M4.1.0/3”
- 如果您的后端是JavaScript,那么您可以利用或调整一些不受支持的代码
- 如果您的后端是其他东西,我不知道现成的解决方案。但是,您可以将上述任意一种中的代码移植到您的平台
但它只接受奥尔森时区描述
嗯,嗯,。。并不是说timedatectl
接受这一点,而是时区数据库就是这样构造的。我说,不可能将任何posix规范转换为zoneinfo条目,但是您可以将所有zoneinfo条目转换为posix规范并拥有一个映射。但是,实际上,只需从/etc/environment
设置TZ
。如果不熟悉,请使用man tzfile localtime timedatectl
。另一方面,您可以采用posix规范,生成tzfile并使用timedatectl进行设置。您还可以在/etc/systemd/system.conf
中的DefaultEnvironment
中设置TZ
——假设systemd
是您的系统管理器,它将使用TZ集启动所有服务,因此,它将被设置在任何地方。