Ubuntu

為什麼我的日期輸出的時區為“STD”?

  • May 15, 2019

當我date在 WSL 下的 Ubuntu 上執行時,它會列印:

Wed May 15 19:33:37 STD 2019

為什麼這STD裡面有字元串?我在網上找不到帶有縮寫 STD 的時區(例如這裡),Google搜尋“日期標準”給了我意想不到的結果。

感謝Jesse_b找到這個Stack Overflow Q/A

TL;DR WSL/usr/share/zoneinfo/Msft/localtime在硬連結到/etc/localtime. Msft 文件使用編造的名稱DSTor STD,它們不代表特定的時區。


實際發生的是 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 時區,它只是說“DST”(我假設是標準的)。

因此,“DST 代表什麼時區”的答案是沒有的,任何試圖匹配(通過 readlink 或只是搜尋)/etc/localtime中的時區文件的Linux 程序,/usr/share/zoneinfo都只會得到“Msft/localtime”作為答案。“技術上準確,但完全沒用”的答案。


計劃於 2019 年 5 月最終發布的 Windows 19H1 (1903) 更新解決了此問題,並且 WSL 發行版將盡可能報告正常時區:

Windows 1903 WSL 顯示正確的時區

在最終公開發布之前,新版本已經可以通過 Windows Insider 程序獲得,因此如果您遇到由區域標籤引起的活動問題,可以解決它。您無需執行任何操作即可啟動它或應用新時區。

引用自:https://unix.stackexchange.com/questions/519039