如何看待编程中的时间

如何看待编程中的时间

Hacker News 摘要

原标题:How to Think About Time in Programming

在软件开发中,时间处理无处不在,但许多程序员对此感到害怕和畏惧。许多人的谈论常常提到难以理解的时区边缘案例,以及像“只使用UTC”这样绝对的建议。这种方式在需要精准时间记录或涉及用户的日期时间交互时,几乎肯定会导致错误或混淆。因此,本文提出了一种关于时间的概念模型,以帮助理解这一复杂主题。

首先,文章区分了“绝对时间”和“民用时间”两个重要概念。绝对时间指的是时间的独特瞬间,例如某个事件发生的确切时刻(比如运动员冲过终点线的瞬间)。这种时间可以通过一个参考点(称为“纪元”)来精确表示,而程序员通常使用Unix时间,从1970年1月1日00:00:00 UTC(Unix纪元)开始计算秒数。

而民用时间则利用较高层次的语言和标准来标记绝对时间,最常见的是公历(即格里历)。人们在使用民用时间时,通常很少以“距离Unix纪元的秒数”来交流,而是使用年、月、日、时、分、秒这样的格式。尽管不同地区可能采用不同的“地方化”格式(例如,美国的日期格式与德国不同),但是底层信息是相同的。

接下来,文章谈到现代时间保持的复杂性。Unix时间和格里历都是“从纪元秒数”表示的,可以相互转换。而现代时间又引入了协调世界时(UTC),它是用于全球同步时钟的标准,定义了秒的持续时间并通过国际原子时来维护。而时区则解决了全球不同地区太阳位置不同的问题,使得民用时间能够在不同地区保持一致。

文章继续解释了时区这一概念。时区指的是一些地区遵循相同民用时间规则的区域。许多程序常常忽略时区规则可能的变化,例如加利福尼亚州每年会在夏令时和标准时间之间切换。这意味着程序所选择的时区应当考虑到这些变化。

随后,文章提到了如何处理中间时间的模糊性。例如,民用时间和UTC之间的转换需要了解具体的UTC偏移量。在使用IANA时区数据库时,可以根据历史记录获取当前及过去的时区规则,帮助确保绝对时间到民用时间的准确转换。

最后,文章强调,没有一种简单的方法可以使我们处理时间问题变得轻松。每个地区的UTC偏移可能随时发生变化,因此在处理涉及多个时区的应用时,开发者需要特别小心。为了确保准确性,程序员应该使用IANA时区数据库来跟踪时区历史和变化,以便进行正确的时间计算和转换。


原文:https://shanrauf.com/archive/how-to-think-about-time-in-programming

评论:https://news.ycombinator.com/item?id=44370426

Report Page