Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Posix时区字符串到奥尔森字符串_C_Linux_Timezone_Tdatetime - Fatal编程技术网

C Posix时区字符串到奥尔森字符串

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时区字符串匹配的数据,但在开始该路径之前,我想知道是

我们有一个嵌入式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集启动所有服务,因此,它将被设置在任何地方。