timezone – MinGW MSYS,MSVCRT和TZ环境变量

简而言之,如何让MSVCRT和MinGW MSYS共享TZ环境变量而不会发生冲突?或者,如何使两个支持时区没有冲突?

更多的信息

为了让MSYS的日期命令显示正确的本地时间,并且因为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名称部分:

If daylight saving time is never in effect in the locality, set TZ without a value for dzn. The C run-time library assumes the United States’ rules for implementing the calculation of daylight saving time (DST)

因此,在TZ变量中简单存在DST名称将导致依赖于_tzset的程序在美国境外发生故障.这是我的Bazaar DVCS的情况,我迟到了一小时的提交时间,因为MSVCRT假设我已经根据TZ设置进入了DST期间.如果我将TZ留空,M​​SYS日期显示UTC时间,但MSVCRT(和Bazaar)工作正常.如果我如上设置TZ,那么MSVCRT会增加一小时的提交时间,但MSYS日期会显示本地时间.

Bazaar受到影响,因为它使用Python,而后者又在Windows下使用MSVCRT.即使我可以从DST名称中删除所有内容,这将破坏MSYS中的日期命令.我也尝试了几种TZ值. MSYS似乎缺少比上面GNU参考中描述的更多的时区支持.另外,我想避免仅在调用Bazaar时设置TZ,或者仅在调用date命令时设置TZ,而是设置更通用的解决方案.

替代格式和zoneinfo数据库

TZ有一种替代格式,上面的GNU文档中有第三种格式,但MSYS似乎不支持它,如上所述:

But the POSIX.1 standard only specifies the details of the first two formats,

似乎第三种格式只是IANA的时区数据库,which describes a different format for TZ,MSYS似乎也不支持,如上所述:

To use the database on an extended POSIX implementation set the TZ environment variable to the location’s full name, e.g., TZ="America/New_York".

如上所述我试图手动将IANA的zoneinfo安装到MSYS上,但没有成功.我不确定这些语句是否正确,MSYS甚至无法识别它们的格式,或者我是否无法正确安装zoneinfo数据文件.我找不到编译版本也不能自己编译,所以我只是从Ubuntu尝试了tzdata包.

但是对我来说奇怪的是,上面的GNU C库文档已经提供了一个时区数据库(听起来像zoneinfo).但是如上所述我在MSYS的任何地方都找不到任何类型的时区数据库,我也找不到任何与时区相关的mingw-get包.我想知道开发人员是否只是从发布中删除它.这是文档说的:

The GNU C Library comes with a large database of time zone information for most regions of the world, which is maintained by a community of volunteers and put in the public domain.

总而言之,如果我可以在MSYS中制作zoneinfo或类似的替代工作,那么我可以放弃目前设置TZ的方法,如上所述.但是,我无法找到有关MSYS中时区支持的任何有用信息.

最佳答案 简单的解决方案是按预期设置windows环境变量,然后将MSYS的〜/ .profile文件中的变量更改为POSIX期望的值.

点赞