简而言之,如何让 MSVCRT 和 MinGW MSYS 共享 TZ 环境变量而不冲突?或者,如何使两者都支持时区而不会发生冲突?
更多的信息
为了让 MSYS 的 date 命令显示正确的本地时间,并且因为 MSYS 本身使用自己的 C 运行时而不是 MSVCRT,我根据 GNU C 库文档设置了 TZ 环境变量:
export TZ="BRT+3BRST,M10.3.0/0,M2.3.0/0"
不幸的是,这与 Microsoft C runtime specs 冲突,后者规定了 DST 名称部分:
如果夏令时在该地区从未生效,请设置 TZ 而不为 dzn 设置值。C 运行时库假定美国实施夏令时 (DST) 计算的规则
因此,在 TZ 变量中简单地存在 DST 名称将导致依赖于_tzset
美国以外的程序出现故障。这是我在 Bazaar DVCS 的情况,我的提交时间错误,晚了一小时,因为 MSVCRT 假设我已经根据 TZ 设置进入 DST 期间。如果我将 TZ 留空,MSYS 日期会显示 UTC 时间,但 MSVCRT(和 Bazaar)工作得很好。如果我如上所述设置 TZ,则 MSVCRT 会增加一小时的提交时间,但 MSYS 日期显示本地时间。
Bazaar 受到影响,因为它使用 Python,而 Python 在 Windows 下又使用 MSVCRT。即使我可以从 DST 名称中删除所有内容,这也会破坏 MSYS 中的日期命令。我也尝试了 TZ 的几个值。除了上面 GNU 参考中描述的内容之外,MSYS 似乎缺少任何进一步的时区支持。另外,我想避免只在调用 Bazaar 时设置 TZ,或者只在调用 date 命令时设置它,而是一个更通用的解决方案。
替代格式和 zoneinfo 数据库
TZ 有另一种格式,上面的 GNU 文档中的第三种格式,但 MSYS 似乎不支持它,如下所述:
但是 POSIX.1 标准只规定了前两种格式的细节,
似乎这第三种格式只是 IANA 的时区数据库,它描述了一种不同的 TZ 格式, MSYS 似乎也不支持,如下所述:
要在扩展的 POSIX 实现上使用数据库,请将 TZ 环境变量设置为位置的全名,例如
TZ="America/New_York"
.
Desipe 上面我试图将 IANA 的 zoneinfo 手动安装到 MSYS 上,但没有成功。我不确定这些语句是否正确,MSYS 甚至无法识别它们的格式,或者我只是未能正确安装 zoneinfo 数据文件。我找不到编译的版本,我自己也编译不了,所以我只是尝试了 Ubuntu 的 tzdata 包。
不过,对我来说奇怪的是,上面的 GNU C 库文档已经带有一个时区数据库(在我看来,这听起来像 zoneinfo)。但是,如前所述,我在 MSYS 的任何地方都找不到安装任何类型的时区数据库,也找不到与时区相关的任何 mingw-get 包。我想知道开发人员是否只是将其从版本中删除。这就是文档所说的:
GNU C 库带有一个包含世界大部分地区时区信息的大型数据库,该数据库由志愿者社区维护并置于公共领域。
所以总而言之,如果我可以在 MSYS 中进行 zoneinfo 或类似的替代工作,那么我可以放弃我目前设置 TZ 的方法如上。但是,我在 MSYS 中找不到任何关于时区支持的好信息。