总之,如何使两者MSVCRT和MinGW MSYS分享没有冲突TZ环境变量? 或者说,如何使二者均支持时区没有冲突?
更多信息
为了有MSYS的date命令显示正确的本地时间,因为MSYS本身使用它自己的C运行时,而不是MSVCRT,我已经设置TZ环境变量根据GNU C库文件 :
export TZ="BRT+3BRST,M10.3.0/0,M2.3.0/0"
不幸的是, 这种冲突与微软的C运行时的规格 ,这就决定了DST名部分:
如果实行夏令时是从来没有在当地的影响,设置TZ不为DZN值。 C运行时库假定美国的规则实施的夏令时间的计算(DST)
因此,在TZ变量DST一个名称的简单存在会导致依赖于节目_tzset
到美国以外的故障。 这是我的情况与集市DVCS,在那里我已经越来越错误的提交时间,一小时晚,因为MSVCRT假设我已经基于TZ设置输入DST期。 如果我离开TZ空,MSYS日期显示UTC时间,但MSVCRT(和集市)的作品就好了。 如果我设置TZ如上,然后MSVCRT增加1小时提交时间,但MSYS日期显示本地时间。
集市受到影响,因为它使用Python又使用MSVCRT Windows下。 即使我可以删除一切从DST的名字,将在MSYS打破date命令。 我曾尝试TZ的几个值也是如此。 MSYS似乎缺乏任何进一步的时区支持比是在GNU参考如上所述。 另外,我想避免调用集市时TZ不仅设置,或者它只是调用date命令的时候,而是更广泛的解决方案集。
替代格式和区信息数据库
没有为TZ,第三个以上GNU文档以其他格式,但它似乎没有MSYS,支持如说:
但是POSIX.1标准只规定了前两种格式的细节,
看来这第三格式只是IANA时区数据库, 它描述了一个不同的格式TZ这似乎没有任何MSYS的支持,如说:
要在扩展POSIX实现使用的数据库设置TZ环境变量的位置的全名,如TZ="America/New_York"
。
Desipe我试图手动安装IANA的时区信息到MSYS无功而返以上。 我不知道如果这些陈述是正确的,他们的格式不甚至MSYS的认可,或者如果我只是未能正确安装区信息的数据文件。 我找不到编译版本,无论是我可以编译我自己,所以我只是尝试了从Ubuntu上的tzdata包。
奇怪的东西对我来说,虽然,是上述GNU C库文档站在它带有一个时区数据库已经(这听起来好像区信息)。 然而,由于说我找不到MSYS装在任何地方任何时区数据库中,无论是我能找到相关的时区的任何MinGW的-得到包。 我不知道如果开发商只是从发行版中删除它。 这是该文件说什么:
GNU C库配备了一个大型数据库的时区信息是由志愿者组成的社区维护,并把在公共领域的世界大部分地区。
所以总而言之,如果我能把区信息或类似的替代工作在MSYS,然后我可以放弃我的当前设置TZ如上的方法。 我找不到了,不过,有关MSYS时区支持任何有用信息。
简单的解决办法就是像您期望然后更改变量在MSYS你的〜/ .profile文件什么POSIX希望设置您的Windows环境变量。
我想通了MSYS实际上应该没有TZ自动检测时区。 下面的错误报告单证问题: MSYS不能在本地化的Windows处理timeozones 。
与此同时
到目前为止,我已经找到,而这个错误没有得到固定的最好的解决办法是:
创建一个名为例如一个包装脚本runcrt.sh
,可从系统路径和含:
#!/bin/bash env -u TZ $(basename "$0").exe "$@"
这个脚本,每个MSVCRT计划,我打算在MSYS运行创建符号链接NTFS,但没有exe扩展名,并在系统路径的实际可执行文件之前。 例如,红宝石,蟒,BZR等
出于性能的考虑,TZ(动态生成的输出语句)进入的缓存配置/etc/profile.d/timezone.sh
在Windows初始化(其实我们只需要更新TZ一年一次,这是多么经常DST时段可以不断变化, 但是无所谓)。
设置BASH_ENV到/etc/profile.d/timezone.sh
,所以不只是互动的bash会话也shell脚本可以时区感知。
这样一来,无论是在交互或者从一个shell脚本,调用bzr commit
,例如,将得到正确的提交日期到代码库中,因为正在与TZ未设置执行的命令。 同样,TZ设置为所有其他命令,如日期和ls,所以他们打印正确的本地时间为好。 我已经下降仅MSYS设置TZ命令,并留下空白为别的,因为未设置操作比采购出口快得多的相反的做法。
MSYS2作为替代
MSYS2,然而,不受此问题,并正确识别时区。 事实上,它有适当的时区支持:
$ tzset
America/Sao_Paulo
$ date +"%T, timezone %Z (%z)"
10:18:12, timezone BRT (-0300)
$ TZ=America/Los_Angeles date +"%T, timezone %Z (%z)"
06:18:14, timezone PDT (-0700)
在你的环境中你没有运行纯粹的Windows任何问题,没有MSYS。 你必须运行纯MSYS,当你不访问本地的Windows应用程序,像巴扎没有问题。 这就是我从你的问题的假设。
特殊的脚本包装你重置TZ
对每个Windows命令行下运行MSYS似乎是合理的,我想这是你做了什么。 我知道这是不是你所期望的答案,或者一个你可以自己写,但因为没有其他的答案,我想至少应该是在这里:)最低邪恶。
最后,我想3个级别设置的TZ
:
- 一种用于微软值是Windows系统设置中设置
- 一种用于MSYS值设置在
/etc/profile
或msys.bat
- 再包装为微软的值运行中MSYS Windows命令,如:
#!/bin/bash
export TZ=; /usr/bin/bazaar "$@"
在文件/usr/local/bin/bazaar
我不能想象一个更通用的解决方案。 一个shell怎么能知道哪个版本TZ
变量优选的是,给定的命令?