为什么我的日期输出以“STD”作为时区?

use*_*086 3 command-line ubuntu date windows-subsystem-for-linux

当我date在 WSL 下在我的 Ubuntu 上运行时,它会打印:

Wed May 15 19:33:37 STD 2019
Run Code Online (Sandbox Code Playgroud)

为什么这里面有字符串STD?我在网上找不到缩写为 STD 的时区(例如这里),谷歌搜索“日期标准”给了我意想不到的结果。

Jef*_*ler 6

感谢Jesse_b找到这个Stack Overflow Q/A

TL;DR WSL/usr/share/zoneinfo/Msft/localtime在硬链接到/etc/localtime. Msft 文件使用组合名称DSTSTD,它们不代表特定的时区。


实际发生的是 WSL 尝试在 Linux 中匹配您的 Windows 时区。这是一个非平凡的映射,如这里所见(讨论)。因此,我相信 WSL 所做的不是尝试击中不断移动的目标,而是使用Windows API来获取 Windows 时区信息,并根据该信息动态生成时区信息文件

我相信wslhost(特别是 中的代码C:\Windows\System32\lxss\LxssManager.dll)对您在 Windows 中的当前时区进行此检查,并写入/usr/share/zoneinfo/Msft/localtime文件。这就是为什么当 Windows 中的时区发生变化时,您会立即在已经运行的 WSL 中看到影响。但是由于没有从 Windows 时区到 Linux 或 POSIX 时区的完美映射,wslhost可能只是名称的翅膀,这就是 DST 发挥作用的地方。

更新:实际上,如果您在夏令时区时区,我认为它只是说“DST”,而对于非 DST 时区则说“STD”(我假设是标准的)。

因此,“DST 代表什么时区”的答案是否定的,并且任何尝试匹配(通过读取链接或仅搜索)中/etc/localtime的时区文件的Linux 程序/usr/share/zoneinfo都只会得到“Msft/localtime”作为答案。“技术上准确,但完全没用”的答案。


计划于 2019 年 5 月最终发布的 Windows 19H1 (1903) 更新解决了此问题,WSL 分发版将尽可能报告传统时区:

Windows 1903 WSL 显示正确的时区

在最终公开发布之前,新版本已经可以通过 Windows Insider 程序获得,因此如果您有由区域标记引起的活动问题,则可以解决它。您无需执行任何操作即可激活它或应用新时区。