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

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

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

Wed May 15 19:33:37 STD 2019

STD为什么里面有这个字符串?我无法在线找到缩写为 STD 的时区(例如这里)并谷歌搜索“date std”给了我意想不到的结果。

答案1

谢谢杰西_b为了找到这个堆栈溢出问答:

长话短说WSL 动态生成一个假时区信息文件,/usr/share/zoneinfo/Msft/localtime硬链接到/etc/localtime. Msft 文件使用虚构的名称DSTSTD,并且它们不代表特定的时区。


实际上,WSL 尝试在 Linux 中匹配您的 Windows 时区。这是一个不平凡的映射,如图所示这里讨论)。因此,我认为 WSL 所做的不是尝试击中不断移动的目标,而是使用视窗应用程序接口获取 Windows 时区信息,并根据该信息动态生成时区信息文件

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

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

因此,“DST 代表什么时区”的答案是“没有”,任何尝试匹配/etc/localtime时区文件的Linux 程序/usr/share/zoneinfo(通过 readlink 或只是搜索)都只能得到“Msft/localtime”作为答案。 “技术上准确,但完全无用”的答案。


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

Windows 1903 WSL 显示正确的时区

直到最终公开发布,新版本已可通过 Windows Insider 计划获取,因此,如果您遇到由区域标签引起的活跃问题,则可以解决它。您无需执行任何操作即可激活它或应用新时区。

相关内容