不動系統時鐘,讓 Windows 應用程式在任意日期執行
把某個應用程式的時鐘調到明年、讓它停住,或是加速運轉,讓 30 天的試用期在你泡咖啡的工夫裡到期。電腦上的其他部分仍然使用真實時間——網域登入、憑證與其他所有程式都照常運作。
接著它會告訴你,這次替換是否真的生效了。
免費開放原始碼,GPL-3.0 可攜版或安裝版 執行無需系統管理員權限 從不連上網際網路
一次工作階段的樣子
23:59:50
18:12:33
為什麼需要它
測試任何與日期相關的功能,都得撥動時間。常見的兩種做法都不好。
授權到期、試用期、訂閱續約、憑證有效期、權杖壽命、月底與年底報表、利息計提、提醒。
做法一:修改系統時鐘
它會破壞網域登入與 Kerberos,讓 TLS 憑證失效、瀏覽器無法使用,擾亂 Windows Update,還會讓這台電腦上其他所有應用程式寫出錯誤的時間戳記。在加入網域的電腦上,群組原則通常會直接禁止修改,或是幾分鐘後又把時間改回去,於是測試連重複執行都做不到。
做法二:等
也就是說:不測。與日期相關的案例就這樣被跳過,「授權永不過期」的版本也就這樣交到了客戶手裡。
它能做什麼
只有一個處理序穿越時間,電腦上的其他一切都不受影響。
任意時刻
一個具體的日期與時間,或是一個相對的時間——+30 days、-1 year。
流動、凍結或加速
正常速度、停住的時鐘,或是一個整數倍率。x1440 讓一天只需一分鐘。
獨立的時區
只對該處理序生效的固定偏移量,系統時區則原封不動。
子處理序一併跟隨
安裝程式與啟動器都會衍生子處理序。少了這一點,測試只涵蓋了實際執行內容的一半。
工作階段中途跳轉
往前或往後都可以——包括筆電與時間伺服器重新同步後發生的那種往後跳變。
同樣支援 Electron 與 Chromium
透過另一種機制實現,因為它們的時鐘位於沙盒轉譯處理序中,注入搆不到那裡。
別人都沒做的部分
你怎麼知道它生效了?
用其他任何工具,你都無從得知。應用程式啟動了,顯示出某個日期,而你只能假定一切正常。可它也許是透過工具從未攔截的通道讀取時鐘的——來自伺服器、來自資料庫、來自某個執行階段層——到那時,「測試通過」就毫無意義。
- →在真正的測試開始之前就給出判定:生效 / 部分生效 / 未生效
- →在 44 個時間通道中,哪些已被涵蓋,應用程式對每個通道各查詢了多少次
- →哪些通道沒有被涵蓋——如實寫明,絕不省略
- →附帶後果說明的警告:「此應用程式會從網路讀取時間——僅做本機替換可能不夠」
兩分鐘上手
用視窗來探索,用命令列跑 CI。兩者背後是同一個引擎。
# 讓應用程式以 2027 年的最後一秒來執行 chrono run "C:\apps\test.exe" --at 2027-12-31T23:59:59 # 在你泡咖啡時看著 30 天試用期到期:x1440 就是一分鐘一天 chrono run "C:\apps\test.exe" --mode x1440 # 用具名情境取代日期,並把證據寫入檔案 chrono run "C:\apps\test.exe" --preset year-rollover --report session.txt
計算機回答日期測試的另一半——該用哪個日期:
$ chrono calc --preset year-2038 --zone +00:00 Chrono Mock - date calculator preset: year-2038 - 2038 boundary explains: Does the app survive the 32-bit Unix time boundary (2038-01-19T03:14:07Z)? base: 2038-01-19T03:14:07 result: 2038-01-19T03:14:07 formats: ISO date 2038-01-19 ISO datetime 2038-01-19T03:14:07+00:00 US 01/19/2038 PL 19.01.2038 epoch (s) 2147483647 epoch (ms) 2147483647000 FILETIME 137919572470000000 RFC 1123 Tue, 19 Jan 2038 03:14:07 GMT ... what this date lands on: at or past the 2038-01-19T03:14:07Z 32-bit time_t limit (Y2038)
與你可能正在用的工具比較
像 RunAsDate,但補上了缺少的部分
RunAsDate 攔截五個掛鐘時間函式,而且做得很好。以下是兩者的差異——完整頁面還會說明 RunAsDate 在哪些情況下仍是更好的選擇。
| RunAsDate | Chrono Mock | |
|---|---|---|
| 讓一個應用程式以虛擬日期執行 | 是 | 是 |
| 被攔截的時間通道 | 5 | 44(30 個被偏移,14 個僅計數) |
| 加快時鐘 | 否 | 是 |
| 獨立的時區 | 文件中未提及 | 是 |
| 跟隨子處理序 | 文件中未提及 | 是 |
| 告訴你是否生效 | 否 | 是,逐個通道 |
| 可取得原始碼 | 免費軟體,封閉原始碼 | GPL-3.0 |
取得
解壓縮到任意位置即可執行,也可以安裝已簽署的 .msi,供這台電腦上的每個帳戶使用。執行不需要系統管理員權限,zip 套件也不會向登錄寫入任何內容。