程序员相信时间的谎言(2017)

2020-09-13 03:09:04

在过去的几年里,我花了很多时间调试其他工程师的测试代码。这是一项有趣的工作,有时令人沮丧,但总是内容丰富。人们可能不会立即认为测试代码会有错误,但当然所有代码都有错误,测试也不例外。

我一再困惑地发现,测试和应用程序代码中有多少错误都源于对时间的误解或误解。这里我指的是计算机处理时间的有趣方式,以及我们人类如何构建日历的内在根本问题-夏令时只是冰山一角。

事实上,我在别人的(和我自己的)程序中看到了太多这样的误解,所以我认为在这里收集一个更常见的问题清单是值得的。

任何24小时的时间段都将始终在同一天(或周或月)开始和结束。

好吧,那不是真的。但至少程序必须运行的时区永远不会改变。

嗯,当然,必须在生产中运行的程序所在的时区永远不会改变。

系统时钟将始终设置为与正确的本地时间相差不大的时间。

如果系统时钟不正确,它至少会始终保持一致的秒数。

服务器时钟和客户端时钟将始终设置为大致相同的时间。

好的,但是服务器时钟上的时间和客户端时钟上的时间不会相差几十年。

如果服务器时钟和客户端时钟不同步,它们至少会始终相差一致的秒数。

系统时钟永远不会设置为遥远的过去或遥远的未来的时间。

系统时钟上的一分钟与任何其他时钟上的一分钟的持续时间完全相同。

好的,但是系统时钟上一分钟的持续时间与大多数其他时钟上一分钟的持续时间非常接近。

好的,但是系统时钟上一分钟的持续时间永远不会超过一个小时。

无需将系统时间设置为正确的本地时间以外的任何值。

好的,测试可能需要将系统时间设置为正确的本地时间以外的值,但在生产中永远不需要这样做。

CentOS上的旧版本KVM中有一个令人着迷的bug。具体地说,KVM虚拟机没有意识到它没有在物理硬件上运行。这意味着,如果主机操作系统将虚拟机置于挂起状态,则虚拟化系统时钟将保留挂起时的时间。例如,如果VM在13:00挂起,然后在两小时后(15:00)返回活动状态,则VM上的系统时钟仍将反映本地时间13:00。其结果是,每次KVM进入休眠状态时,主机操作系统都会将其置于挂起状态,并且VM的系统时钟将开始偏离实际情况,有时会出现很大的偏差,这取决于VM保持空闲的时间有多长。

可以安装cron作业,以使虚拟化系统时钟与主机操作系统的硬件时钟保持一致。但是在新的虚拟机上很容易忘记这样做,如果不这样做会导致很多有趣的事情。该错误已在较新版本中修复。

这篇文章要归功于帕特里克·麦肯齐(Patrick McKenzie)关于用户名的一篇规范的博客文章,多年来我一直在反复阅读这篇文章,并厚颜无耻地抄袭了它的概念和风格。如果你还没有读过这本珍品,现在就去读吧。我保证你会喜欢的。

我要感谢在BoingBoing和Hacker News以及Reddit和MetaFilter上对这篇帖子发表评论的每一个人,以及在Twitter上分享他们与时代周刊的奇怪经历的每一个人。

你提供了这么多有趣的边缘案例,我已经忘记了,也提供了很多我没有意识到的奇怪之处。例如:在犹太历法中,一天从日落开始,而不是从午夜开始。正如布鲁斯·斯特林(Bruce Sterling)指出的那样,我甚至没有考虑到当计算机在绕黑洞轨道运行的宇宙飞船上时会发生什么。

有足够的材料再做一次(更长的!)。发布关于此主题的帖子。但首先,我必须读完你们所有&500英镑的评论,以及链接的大量令人惊叹的研究材料。

再次感谢您的热情和令人难以置信的细节水平。在过去的24小时里,我学到了很多关于时间的知识。书呆子们,我向你们致敬。

程序员相信时间的谬误现在有一个规范的永久链接,你可以在引用这篇文章时使用。

特别感谢SWAlChemist,在我不小心弄丢了这个TLD后,他帮我找回了它!