更多信息
为了让MSYS的日期命令显示正确的本地时间,并且由于MSYS本身使用自己的C运行时而不是MSVCRT,我已经根据GNU C库文档设置了TZ环境变量。export TZ="BRT+3BRST,M10.3.0/0,M2.3.0/0"
不幸的是,这与 Microsoft C 运行时规范冲突,该规范规定了 DST 名称部分:
如果当地从未使用夏令时,请在 TZ 中设置没有 dzn 值的值。C 运行时库假定美国实施夏令时 (DST) 的计算规则
因此,在 TZ 变量中存在 DST 名称将导致依赖于 _tzset
的程序在美国以外的地方发生故障。这是我在使用 Bazaar DVCS 时遇到的问题,我一直得到错误的提交时间,晚了一小时,因为 MSVCRT 假定我已经根据 TZ 设置进入了 DST 期间。如果我将 TZ 留空,则 MSYS 日期显示 UTC 时间,但 MSVCRT(和 Bazaar)正常工作。如果我按上述方式设置 TZ,则 MSVCRT 将提交时间增加一小时,但 MSYS 日期显示本地时间。
备选格式和区域信息数据库
有一个备选的TZ格式,是GNU文档中的第三种格式,但似乎不被MSYS支持,如下所述:
“但POSIX.1标准仅指定前两个格式的详细信息。”
这第三种格式似乎只是IANA的时区数据库,描述了不同的TZ格式, 似乎MSYS也不支持,如下所述:
“要在扩展的POSIX实现上使用数据库,请将TZ环境变量设置为位置的全名,例如:TZ =“America / New_York”。”
尽管我尝试手动将IANA的zoneinfo安装到MSYS上,但并没有成功。我不确定这些语句是否正确,它们的格式甚至都无法被MSYS识别,或者我只是没有正确安装zoneinfo数据文件。我找不到已编译的版本,也无法自己编译,所以我只是尝试了Ubuntu的tzdata包。
然而,对我来说很奇怪的是,GNU C库文档中提到它已经带有一个时区数据库(听起来像是zoneinfo)。但是正如我所说,我无法在MSYS中找到任何类型的时区数据库,也找不到与时区相关的任何mingw-get软件包。我想知道开发人员是否仅仅从发布版中删除了它。以下是文档的内容:
“GNU C库附带了一个大型的时间区域信息数据库,涵盖世界上大多数地区,由志愿者社区维护,并放入公共领域。”
因此,总之,如果我能让zoneinfo或类似的替代方案在MSYS中工作,那么我就可以放弃我的当前设置TZ的方法。然而,我找不到有关MSYS中时区支持的任何好信息。