A RunAsDate alternative, with the parts that were missing
RunAsDate has been the answer to "run this program at a different date on Windows" for years, and it is a good one. This page is about where the two differ, and where RunAsDate is still the better pick.
Side by side
| RunAsDate | Chrono Mock | |
|---|---|---|
| Runs one application at a fake date | yes | yes |
| Leaves the system clock alone | yes | yes |
| Time functions intercepted | 5 | 41 channels |
| Clock faster than real time | not offered | any whole multiplier |
| Freeze the clock | not offered | yes |
| Jump while the app is running | not offered | forwards and backwards |
| Time zone for that process only | not documented | yes, fixed offset |
| Child processes inherit the session | not documented | yes |
| Tells you whether it worked | no | verdict, per channel, with call counts |
| Electron and Chromium applications | not offered | separate mechanism |
| Command line for CI | yes | yes, with exit codes and JSON |
| Source code | freeware, closed | GPL-3.0 |
| Size | under 40 KB | 1.6 MB CLI, 69 MB with the window |
| Old Windows versions | back to Windows 2000 | Windows 10 and 11 |
"Not documented" means the feature is not mentioned on the RunAsDate page. It is not a claim that the tool lacks it.
The difference that matters most
It is not the channel count. It is that RunAsDate tells you, honestly, in its own documentation, that it "will not affect applications that take the current date/time from another source" - and then leaves you to work out whether yours is one of them.
Chrono Mock treats that same sentence as something to measure. Every session ends with a verdict, the channels the application actually read with a count for each, the channels that were missed, and a warning when the application was seen opening a network connection before it ever asked the clock.
An application that looks time-shifted but is not is worse than one that never launched - it produces a passing test that means nothing. How the audit works →
Five functions, or 41 channels
RunAsDate intercepts GetSystemTime, GetLocalTime,
GetSystemTimeAsFileTime, NtQuerySystemTime and
GetSystemTimePreciseAsFileTime. For a great many applications that is
genuinely enough, because that is where the wall clock is read.
The rest of the surface is where date-dependent code tends to hide:
- the time zone - four functions, plus the whole family that converts between zones, which is how a report lands on the wrong day
- the elapsed-time axis - tick counts and unbiased interrupt time, which is what a trial countdown usually measures
- sleeps and waits, so a delay is a delay on the session clock and not on the real one
- timers - waitable, window, thread-pool and multimedia
- process creation, so an installer's children run in the same session rather than in the present day
When RunAsDate is the better choice
Genuinely, and not rarely:
- You need one date, at normal speed, right now. RunAsDate is under 40 KB, has no window to learn and has been doing exactly this for many years.
- You are on an older Windows. RunAsDate goes back to Windows 2000. This tool targets Windows 10 and 11 and is not tested anywhere older.
- Size matters. 40 KB against 1.6 MB for the command line, or 69 MB with the window, is not a close comparison.
- You do not want a verdict. Measuring coverage means reading the result. If the test is throwaway, that is overhead you did not ask for.
The two also coexist. Nothing here stops you keeping RunAsDate for the quick case.
What neither of them is for
Both tools turn up in searches about extending trial periods. This one is not built for that, and no example, preset or page here will ever demonstrate it. Chrono Mock is for testing software you are responsible for - your own licence expiry, your own renewal logic, your own month-end report.
It is also the case least likely to work. Licence protection routinely reads time through routes chosen to be hard to intercept - the shared user-mode data page, direct system calls, a server - and a clock moving backwards is a condition such code is written to detect. The audit will tell you that it did not work, which is the honest answer rather than a useful one.