讓應用程式在另一個時區執行
落在錯誤日期的報表、提早一小時響起的提醒、讀起來像是明天的時間戳記——這些問題大多只會出現在你自己並不身處的時區裡。這個工具給一個處理序單獨的偏移量,而你的系統時區原封不動。
為什麼常見的辦法幫不上忙
- 修改 Windows 時區會改動所有東西——你的行事曆、你的記錄檔、你的會議——而在受管理的電腦上,這也許根本不由你來改。
- 設定
TZ對一些執行階段有效,對另一些無效。讀取GetTimeZoneInformation的原生 Windows 應用程式完全不會察覺。 - 瀏覽器開發人員工具可以覆寫網頁的時區,這很好,但與桌面應用程式無關。
一個處理序,一個偏移量
工作階段帶有自己的偏移量。應用程式向 Windows 詢問自己處於哪個時區,得到的就是這個答案,而電腦上的其他所有程式得到的是真實的答案。
# 同一個時刻,從美國西岸看過去 chrono run "C:\apps\test.exe" --at 2027-01-15T09:00:00 --zone -08:00 # 只改時區——今天的真實日期,別人的時鐘 chrono run "C:\apps\test.exe" --zone +09:00
計算機回答問題的另一半——某個時刻在別處實際讀作什麼。轉換會保持時刻不變,只改變掛鐘時間,一個日期落在錯誤的一天,恰恰就是這麼發生的:
$ chrono calc --base 2027-01-15T09:00:00 --zone +01:00 --to-zone -08:00 Chrono Mock - date calculator base: 2027-01-15T09:00:00 step 1: zone -08:00 -> 2027-01-15T00:00:00 result: 2027-01-15T00:00:00 formats: ISO date 2027-01-15 ISO datetime 2027-01-15T00:00:00-08:00 US 01/15/2027 PL 15.01.2027
中歐的上午九點,在美國西岸是午夜。同一個時刻,而依本地日期分組的日報,會因為執行的位置不同而把它歸到不同的一天。
如實說明的限制,在這裡尤其重要
工作階段時區是沒有日光節約時間的固定偏移量。
設為 +01:00 的工作階段,無論它的時鐘讀到的是一月還是七月,都停留在 +01:00。因此,跨越真實切換的執行,會與該時區實際顯示的時間相差一小時,而讓應用程式經歷日光節約時間的切換,目前還不是這個工具能做的事。日期計算機會如實說明這一點,而不是猜測。
- 該時區會把自己回報為「Chrono Session」,這是任何 Windows 登錄都不認識的名稱。凡是把這個名稱對應回時區的東西——包括 .NET 的
TimeZoneInfo.Local——都會退回到使用偏移量,這是正確的答案。堅持要用登錄中名稱的應用程式則找不到。 - Java 會把工作階段時區當作偏移量來接收。工作階段時區沒有日光節約時間,背後也沒有城市,所以 Java 用它的偏移量來命名——對於 +05:30 的工作階段就是
GMT+05:30。 - 在 Chromium 和 Electron 模式下,頁面同樣讀取工作階段時區。它是同一個固定位移:每個頁面和 worker 都會被放到這個時區,並檢查自己讀到的值。Electron 應用程式的主處理程序在 Node 中執行 JavaScript,工作階段無法觸及,所以它保持真實時鐘。
- 偏移量的範圍是 -14:00 到 +14:00,以整分鐘為單位。超出這個範圍的值會被拒絕,而不是悄悄迴繞。
其中哪一條適用於你的應用程式,是可以量測的,而不是靠猜。 工作階段會回報它自己的涵蓋情況 →