【问题标题】:What is the correct POSIX-style TZ format: <+04>-4 vs UNK-4什么是正确的 POSIX 风格的 TZ 格式:<+04>-4 vs UNK-4
【发布时间】:2022-01-21 10:46:17
【问题描述】:

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

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

ESP32 可以正确处理 UNK-4,但会以 -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 受到了这个问题的影响。那么是否有另一个官方来源的时区数据库使用没有“”的格式?

感谢您的帮助!

干杯 哈拉尔

【问题讨论】:

  • 为什么需要在 EPS32 中解析时区文件?我认为您应该在您的主机上执行此操作(并且可能使用库)。使用时区文件很棘手:您应该关注它的开发(例如,最近的更改会删除各个国家/地区的旧数据)。
  • ESP32 将没有互联网连接。 UTC 时间来自 GPS 模块,我编写了一个库来从 GPS 坐标中获取时区 (github.com/HarryVienna/ESP32-Timezone-Finder-Component) 你是对的,时区数据不是静态的,但我看不到其他离线组件的解决方案,,,
  • 我还是不明白。您可以在计算机上解析时区。以更好的 EPS32 格式准备数据,可能会删除大部分无用数据(并且已经采用 EPS 友好格式):您定义提供给用户的时区列表、偏移量和一些规则(夏令时)。请记住,时区并不意味着离线:有很多变化(以及最后几天)。如果您还没有准备好每年两次更新固件,您应该检查是否只有 UTC 偏移量(这是恒定的):更好的界面愚蠢而不是错误的数据。

标签: timezone posix tzdata


【解决方案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 在这种情况下,字段不应包含引号字符。

所以对于“-4”,缩写为“+04”,而偏移量仍为东 4h。

【讨论】:

    猜你喜欢
    • 2012-05-28
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多