cmd 窗口中的 ls 给出一个小时的休息时间

cmd 窗口中的 ls 给出一个小时的休息时间

我已经ls在 Windows XP 电脑上安装了。它附带了 msysgit。我已经用了一段时间了,而且事实证明,即使在 DOS 提示符下我也经常使用它。超过dir

问题是它给我的时间戳有一个小时的偏移。查看 gcc.exe 的日期,ls显示 15:01,dir显示 16:01:

C:\MinGW\bin>ls --full-time gcc.exe
-rwxr-xr-x    1 gaf      Administ    90112 Thu Apr 24 15:01:53 2008 gcc.exe

C:\MinGW\bin>dir gcc.exe
 Volymen i enhet C har ingen etikett.
 Volymens serienummer är 644A-83A3

 Innehåll i katalogen C:\MinGW\bin

2008-04-24  16:01            90 112 gcc.exe
               1 fil(er)              90 112 byte
           0 katalog(er)  104 458 203 136 byte ledigt

(抱歉我的语言有点奇怪)

我可以说这是ls做错了,我用新创建的文件检查了这一点。

这很令人不安,有什么建议可以解决吗?


编辑:在 njd 的回答后添加了更多信息。

更改环境变量 TZ 确实有效果。我住在瑞典,冬天是 CET,夏天是 CEST。我测试了 UTC、CET 和 CEST,得到了奇怪的结果(对我来说):

C:\Program\Git\bin>set TZ=UTC

C:\Program\Git\bin>.\date
Mon Feb 15 12:53:26 GMT 2010

C:\Program\Git\bin>set TZ=CET

C:\Program\Git\bin>.\date
Mon Feb 15 12:53:50 GMT 2010

C:\Program\Git\bin>set TZ=CEST

C:\Program\Git\bin>.\date
Mon Feb 15 12:53:59 GMT 2010

C:\Program\Git\bin>set TZ=CET+1

C:\Program\Git\bin>.\date
Mon Feb 15 11:54:27 CET 2010

C:\Program\Git\bin>set TZ=CET-1

C:\Program\Git\bin>.\date
Mon Feb 15 13:54:35 CET 2010

将 TZ 设置为 CET 或 CEST 无效。显示的日期仍为 GMT。看来字符串 CET 单独无效。它只是一个用于显示的字符串,并且仅在存在明确偏移时才会被考虑。

C:\Program\Git\bin>set TZ=FOO-1

C:\Program\Git\bin>.\date
Mon Feb 15 14:00:29 FOO 2010

C:\Program\Git\bin>set TZ=BAR-1

C:\Program\Git\bin>.\date
Mon Feb 15 14:00:42 BAR 2010

所以它看起来。

-1 效果正确。但瑞典的时间是 UTC+1: 维基百科上的 CET

惯例上是否存在不匹配的情况,TZ 中的 -1 是 UTC+1?

如果我想让操作系统决定现在是夏季还是冬季(如 njd 的回复中所述),我可以省略开始和结束时间。我猜正确的字符串是TZ=CET-1CEST-2,对吗?

我不确定 Windows 在夏季会做什么。如果它更新时钟本身,上面的字符串将不起作用。如果它只更新偏移量,那么这可能会起作用。更多见解?

答案1

看起来ls命令对欧洲时区以及 CEST 生效的日期了解不够。

我猜测 DIR 报告的 16:01 是 CEST 16:01,但该ls命令尚未应用夏令时的额外时间。

我不确定 msysgit(或者仅仅是 msys)如何存储时区信息:在 Solaris 中,有用于此的 zoneinfo 文件。

如果有某种方式可以在夏令时开始和结束时与您的 msysgit 工具进行沟通,那么您的ls命令就可以正确执行。

或许这一页提供了线索。
尝试使用以下环境设置

SET TZ=CET+1CEST,M3.5.0/2,M10.5.0/2

这表明 CEST 于 3 月最后一个星期日(第 0 天)凌晨 2 点开始,并于 10 月最后一个星期日凌晨 2 点结束。这应该可以为您提供一些参考。

(通常,仅说明时区和 DST 时区就足够了:“CET+1CEST”,并依靠操作系统知道相关日期应该是什么。但在这里我们明确设置了日期。)

我可以看到我的系统上的 MSys 发生了类似的事情:
DIR 命令(和 Windows 资源管理器)报告的文件,写入时间为 2008-04-1812:19(应该是 BST:GMT+1)由 MSys 显示ls13:19:06

如果我调整时区日期,SET TZ就好像夏令时直到四月底,我可以改变它来匹配 DIR 的输出。

但据我所知,欧盟范围内的夏令时规则是从三月的最后一个星期日(M3.5.0/2)开始,到十月的最后一个星期日结束(M10.5.0/2)。

因此当我输入时(在 MSys shell、Cygwin 或 Unix 中):

TZ=GMT0BST,M3.5.0/2,M10.5.0/2 ls --full-time foo

我应该看到正确的时间,应用了 DST。事实上,我看到的是 13:19,和我根本没有设置时区时一样。

这让我怀疑 MSys 和 msysgit 是否做对了,而 Windows 是否做错了。

相关内容