Page 1 of 1

如何编写和测试时间相关代码

Posted: Sun Mar 02, 2025 5:01 am
by najmulislam
最近我写了很多与时间有关的代码 — 从时区和调度任务到调度不同时区的任务。时间可能真的很棘手。众所周知,时间很难调试,而且很容易被忽视。以下是一些编写和测试时间相关代码的技巧,我希望可以将它们发送给自己:

注意你的代码对时间的假设
Noah Sussman 写了一篇很棒的博客文章,名为“程序员相信的关于时间的谬论”。如果你有时间,这篇文章绝对值得一读,但我将在这里总结一些关键要点:

sleep只要您告诉标准库的函数,它就不一定会休眠。
根据问题领域和要求,这些并不全都重要,但至少在编写代码时意识到错误的假设是件好事。

尽可能使用 UTC
如果您的要求允许,以 UTC 格式存储时间将为您 波兰 whatsapp 数据 省去很多麻烦。对于显示,可以轻松地将 UTC 时间戳转换为特定时区的本地时间。UTC 不遵守夏令时,因此您不必担心时钟向前或向后移动一小时导致的错误。如果您稍后将服务器添加或移动到另一个时区(例如,为国际用户在另一个 AWS 区域添加新实例),使用 UTC,您不必担心服务器时钟设置不同。

从 VM 测试你的应用
测试时区支持的一种简单方法是在设置为另一个时区的虚拟机中启动应用程序。对于具有客户端和服务器组件的应用程序,这可让您在主机上的一个时区运行服务器,同时在客户机上的另一个时区测试客户端。

如果您的应用程序在 Web 浏览器中运行并使用 JavaScript 生成的时间戳,请不要忘记确保new Date()在控制台中运行输出您期望的日期和时间。

在正常工作时间以外测试你的应用
如果您的应用程序的任何部分根据日期、星期或时间而表现不同,请务必在正常开发时间之外进行测试。如果您只在周一至周五上午 9 点至下午 5 点测试您的应用程序,您如何确保它在周六晚上 11 点正常运行?

现在我并不是说你应该花周六晚上的时间来测试软件。相反,只需将系统时钟调快或使用如上所述的虚拟机即可。

测试套件中的模拟时间
除了手动测试之外,在单元测试中测试不同的边缘情况也是一个好主意。例如,如果代码在时钟调整为夏令时时运行会发生什么?代码在 2 月 29 日能正常工作吗?当调用sleep(1)实际上需要 5 秒时,它如何恢复?

通过模拟当前时间来设置这些场景通常比您想象的要容易。如果您使用 Ruby,Timecop宝石提供了设置时间、冻结时间甚至缩放时间的功能。如果最后一个听起来很奇怪,想象一下您想在 30 秒内模拟 1 个月的计费周期。在 Java 中,Joda库有一个设置当前时间的方法。在 JavaScript 中,模拟时间非常
总结
希望这些技巧能帮助人们避免与时间相关的错误。如果我遗漏了任何内容,欢迎在下面的评论中分享。