【发布时间】:2012-10-07 02:38:50
【问题描述】:
简而言之,如何让 MSVCRT 和 MinGW MSYS 共享 TZ 环境变量而不冲突?或者,如何使两者都支持时区而不会发生冲突?
更多信息
为了让 MSYS 的 date 命令显示正确的本地时间,并且由于 MSYS 本身使用自己的 C 运行时而不是 MSVCRT,我设置了 TZ 环境变量according to GNU C library documentation:
export TZ="BRT+3BRST,M10.3.0/0,M2.3.0/0"
不幸的是,this conflicts with 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 的时区数据库,which describes a different format for 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 中找不到任何关于时区支持的好信息。
【问题讨论】:
标签: timezone mingw msvcrt msys