為什麼我的日期輸出的時區為“STD”?
當我
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 文件使用編造的名稱DST
orSTD
,它們不代表特定的時區。實際發生的是 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 Insider 程序獲得,因此如果您遇到由區域標籤引起的活動問題,可以解決它。您無需執行任何操作即可啟動它或應用新時區。