Chrono Mock
語言繁體中文

不動系統時鐘,讓 Windows 應用程式在任意日期執行

把某個應用程式的時鐘調到明年、讓它停住,或是加速運轉,讓 30 天的試用期在你泡咖啡的工夫裡到期。電腦上的其他部分仍然使用真實時間——網域登入、憑證與其他所有程式都照常運作。

接著它會告訴你,這次替換是否真的生效了。

免費開放原始碼,GPL-3.0 可攜版或安裝版 執行無需系統管理員權限 從不連上網際網路

一次工作階段的樣子

應用程式看到的時間
2027-12-31
23:59:50
工作階段時區 -05:00
電腦仍然看到的時間
2026-09-04
18:12:33
主機時區 +02:00
生效——替換已經作用到這個處理序
監看的時間通道 最多 44 個 · 每個都附呼叫次數
Chrono Mock 的工作階段面板。應用程式的時鐘顯示 2038-01-19 03:14:14,旁邊的真實時鐘顯示 2026-09-22 15:50:30,兩者各自帶有已執行時間。下方是從 x1 到 x1440 的速度檔與一個 Freeze 按鈕,接著是相對跳轉與跳轉到輸入日期的選項,頁尾處一個綠色勾號標著 Works,旁邊是紅色的 Stop session 按鈕。
一次正在執行的工作階段。應用程式身處 2038 年,電腦卻不是,判定結果表示替換已經作用到它。

為什麼需要它

測試任何與日期相關的功能,都得撥動時間。常見的兩種做法都不好。

授權到期、試用期、訂閱續約、憑證有效期、權杖壽命、月底與年底報表、利息計提、提醒。

做法一:修改系統時鐘

它會破壞網域登入與 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 在哪些情況下仍是更好的選擇。

 RunAsDateChrono Mock
讓一個應用程式以虛擬日期執行是是
被攔截的時間通道544(30 個被偏移,14 個僅計數)
加快時鐘否是
獨立的時區文件中未提及是
跟隨子處理序文件中未提及是
告訴你是否生效否是,逐個通道
可取得原始碼免費軟體,封閉原始碼GPL-3.0

完整比較,包括 RunAsDate 更勝一籌的地方 →

取得

解壓縮到任意位置即可執行,也可以安裝已簽署的 .msi,供這台電腦上的每個帳戶使用。執行不需要系統管理員權限,zip 套件也不會向登錄寫入任何內容。