常见问题
简短的回答,包括那些关于这个工具不会做什么的问题。
它会改动我电脑的时钟吗?
不会,以后也不会——这正是这个工具的全部意义所在。被改动的时间只对一个进程及其启动的子进程可见。你的域登录、证书、Windows 更新和其他所有应用,全程看到的都是真实日期。
需要管理员权限吗?
运行它不需要。zip 包无需安装程序,不会向注册表写入任何内容,可以放在 U 盘上的文件夹里直接运行。可选的 .msi 只在安装时需要一次管理员权限,因为它会为这台计算机上的每个账户安装。
它能用在我的应用上吗?
老实说,这类工具没有哪一个能事先保证——所以这个工具选择去测量它。每次会话都以一个判定(生效、部分生效、未生效)结束,同时给出应用实际读取过的时间通道清单及各自的调用次数,以及未被覆盖的通道清单。
应用可能通过一条没有被任何东西拦截的途径读取时钟——来自服务器、来自数据库、来自某个运行时层。出现这种情况时,你会收到通知,而不是被留在“测试通过了”的假定里。
它能用于 .NET、Java 和 Python 应用吗?
部分可以,而且差别很重要。这三者都标记为实验性:它们在测试目标上可以工作,尚未经过广泛测试,而内置的审计才是你的事实依据,而不是这一段文字。
- .NET——挂钟时间和会话时区已覆盖。
Stopwatch仍然使用真实的高分辨率计数器,除非你选择启用缩放。 - Java——挂钟时间、经过的时间和会话时区已覆盖。时区以固定偏移量的形式到达,命名形如
GMT+05:30。 - Python——
time.time和datetime已覆盖。perf_counter,以及 Python 3.13 及更高版本中的monotonic,使用的是高分辨率计数器,除非你选择启用。
它能用于 Electron 和 Chromium 应用吗?
可以,通过另一种机制。它们的时钟位于注入够不到的沙盒渲染进程中,所以应用会带着一个调试端口和一个干净的一次性配置文件启动,它自己的 JavaScript 时间 API 被放到会话时钟上——包括 Web Worker 内部,计时器往往实际就在那里。
有一个限制值得了解:Electron 应用的主进程在 Node 中运行,会话无法触及,所以它保持真实时钟,报告也会这样说明。页面及其 worker 读取的是会话时区。
Chromium 与 Electron 模式是如何工作的——它能到达什么、到达不了什么,以及为什么调试端口是需要留意的部分。
能让时间比真实时间走得更快吗?
可以。选择一个整数倍率,应用的时钟就会按这个速度运行——x1440 让一天只需一分钟,于是 30 天的试用期大约半小时就会到期。你也可以冻结时钟,或在会话中途向前、向后跳转。
倒计时和定时器位于另一条轴上,加速它们需要另一个开关,因为缩放它们会改变很多应用所依赖的行为。
能只改时区、不改日期吗?
可以。会话带有自己的固定偏移量,只对该进程可见,系统时区则原封不动。这是大多数工具跳过的部分,也是你复现“只在五个时区之外的客户那里才会出现”的缺陷的办法。
夏令时怎么办?
会话时区是没有夏令时的固定偏移量。设为波兰的会话,无论它的时钟读到的是三月还是七月,都停留在你选定的偏移量上,所以跨越真实切换的运行,会与该时区实际显示的时间相差一小时。
因此,让应用经历夏令时切换,目前还不是这个工具能做的事,日期计算器会如实说明这一点,而不是猜测。
为什么我的杀毒软件会报警?
因为向另一个进程注入库,是一种合法的、有文档记载的 Windows 技术,恶意软件也在使用它。这是由该技术触发的误报,而不是由工具对你的机器所做的任何事触发的。被注入的库是 chrono_hook.dll,由公开的源代码在 GPL-3.0 下构建,你可以自己重新构建。Chromium 和 Electron 模式完全不注入。
下载页面说明了该怎么处理。
这是延长试用期或绕过许可证的办法吗?
不是,它也不是为此而做的。Chrono Mock 是用来测试你自己负责的软件的——你自己的许可证到期、你自己的续费逻辑、你自己的月末报表。这里没有任何示例、预设或页面会演示如何延长别人的试用期。
带有许可证保护的软件,恰恰是最有可能让这个工具失效的情形:防篡改代码经常通过刻意选择的、难以拦截的途径读取时间,而时钟向后拨动正是这类软件被编写来检测的情况。一个方向相反的功能正在规划中——一种针对你自己的应用运行一系列时间操作,并报告你的保护措施拦住了其中哪些的模式。
能在持续集成中使用吗?
可以。命令行版是一个单独的下载,大约 2.4 MB,无需安装运行时。每个命令都支持 --json,并以流水线可以据以分支的退出码结束,会话还可以把它的证据写入文件。
它和 RunAsDate 有什么不同?
RunAsDate 拦截五个墙上时钟函数,而且做得很好。本工具监视 44 个时间通道,并把其中 30 个换到会话时钟上,可以加快时钟,给进程独立的时区,跟随子进程,并在事后告诉你哪些通道真正被覆盖了。它还是开源的,而 RunAsDate 是闭源免费软件。反过来,RunAsDate 可以附加到已在运行的应用程序,本工具做不到。
完整对比还会说明 RunAsDate 在哪些情况下是更好的选择。
这是 Windows 版的 libfaketime 吗?
从精神上说,是的——同样是只为一个程序而不是为整台机器拨动时间的想法。实际上它是另一种实现,因为 libfaketime 依赖 LD_PRELOAD,而 Windows 上并不存在它。有专门讲这件事的一页。
它免费吗?会往任何地方发送东西吗?
免费,并在 GPL-3.0 下开源。无需账号,无遥测,它根本不连接互联网——拔掉网线,整个工具照样能用。
窗口里确实有两个通向外部的控件,所以值得点明,而不是让你自己去发现:标题栏中的 Donate 按钮和 GitHub 按钮。按下其中任何一个都会把一个地址交给你的浏览器,而真正去连接的是你的浏览器。无论哪种情况,Chrono Mock 自己都不会打开任何连接,它对你的应用所测量的任何内容也不会被发送到任何地方。