1

目前我正在为 ESP32 微控制器编写一个组件。因此我需要一个所有时区的列表。

我发现了许多时区文件的来源,但它们对时区值使用不同的格式。一个例子是欧洲/乌里扬诺夫斯克。一些文件使用<+04>-4,其他文件使用UNK-4

ESP32 可以正确处理UNK-4 ,但会以<+04>-4之类的值失败。

有人可以解释一下,“<”和“>”的格式是什么意思?他们为什么不使用缩写?不幸的是,iana 时区数据库也使用了这种格式。

在这个链接:https ://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html你可以阅读“ std字符串指定时区的名称。它必须是三个或更多字符长并且不得包含前导冒号、嵌入数字、逗号、加号和减号

那么这怎么可能是一个有效的 TZ 值呢?

在此链接中:https ://man7.org/linux/man-pages/man5/tzfile.5.html您可以阅读“一些读者错误处理包含“<”的 POSIX 样式 TZ 字符串 或“>”。作为部分解决方法,作者可以避免使用“<” 或“>” 对于仅包含字母字符的时区缩写。 "

显然 ESP32 受到了这个问题的影响。那么是否有另一个官方来源的时区数据库使用不带“<”和“>”的格式?

谢谢你的帮助!

干杯哈拉尔

4

1 回答 1

1

以下是时区名称的 Posix 规范:https ://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03

对于“UNK-4”,“UNK”是时区缩写(Posix 语中的名称),-4 是偏移量,表示本初子午线以东 4 小时。请注意,偏移量的符号与其他所有人使用的符号相反,包括 Posix 的其他部分。

为了区分缩写和偏移量,缩写必须全是字母字符。

但是,如果您希望缩写包含非字母字符,Posix 规范说您可以使用前导“<”和尾随“>”来引用缩写。

  • 在带引号的形式中,第一个字符应为('<')字符,最后一个字符应为('>')字符。这些引用字符之间的所有字符都应是来自当前语言环境中可移植字符集的字母数字字符、('+')字符或('-')字符。在这种情况下,std 和 dst 字段不应包含引号字符。

因此,对于“<+04>-4”,缩写为“+04”,而偏移量仍为东 4h。

于 2022-01-21T13:13:47.127 回答