我已经做了六年的专业开发人员。在这6年里,我工作过的公司或项目中,没有一个不受日期和时间问题的困扰。

几乎每个应用程序都需要以某种方式使用时间,这意味着在某些时候,您将不得不收集、存储、检索和显示日期或时间。处理日期或时间没有灵丹妙药,你永远无法逃避时间概念固有的复杂性,但你可以采取一些步骤来减少处理日期或时间的痛苦。

多年来,我一直在使用不同的编程语言处理时间,我发现以下知识很有用。

选择正确的数据格式

处理时间和日期的第一步是为数据选择一种表示形式。虽然不同的格式看起来或多或少是相同的,但您选择的格式将对您编写和调试代码的方式产生很大的影响。

在需要日期时使用数字时间戳将意味着解析日期时间戳并从中检索日期,根据时区的不同,这可能简单,也可能不简单。

使用自定义字符串表示一段时间似乎很容易存储和操作,但查询起来很困难。此外,使用任何一种人眼不能立即识别的表示形式都会使调试代码变得更加困难。爱游戏官网皇

在选择日期或时间的格式时,我遵守以下规则:

  1. 永远不要使用数字时间戳。它们通常是各种编程语言中最容易通过标准库获得的,但它们不是人类可读的,操作它们的诱惑太大了。
  2. 遵守ISO 8601该标准定义了日期和时间相关数据的格式。为任何语言找到一个可以处理ISO 8601变化的库都很简单。
  3. ISO 8601是一个标准,但它有很多变化。您应该始终选择最适合人类阅读的ISO 8601版本。这不需要额外的工作,但使调试更容易。
  4. 时间戳字符串应该只包含您绝对需要的数据。当处理时间时,字符串不应包含日期,当处理日期时,不应包含时区。为未来的开发人员添加额外的信息会增加解析操作和数据意图的模糊性
  5. 当存储时区时,在时间戳中始终归一化为相同的时区。这不仅使计算机更容易分类和处理数据,而且也使人类开发人员更容易。

遵守这些规则不会让您预先付出太多代价,但当您建立应用程序时,发现时间和日期的使用不符合您的预期时,它们会让您的生活更轻松。

选择正确的工具

与我们行业中的大多数问题一样,时间和日期处理归结为为工作选择正确的工具。

使用您喜欢的语言的标准库中的工具是很诱人的,但这可能不是最好的选择。虽然一些标准库具有出色的日期和时间特性(Python),但其他标准库则非常可怜(Javascript)。使用错误的工具会使开发基于时间的功能变得更加困难,并且更容易让错误进入应用程序。

一个好的处理日期和时间的库可以让你遵循上面提到的5条规则。具体来说,它应该能够:

  • 解析您可能遇到的任何日期表示(包括外部表示)。
  • 输出到您可能需要的任何日期表示形式(包括外部表示形式)。
  • 通过从日期和时间中添加或减去时间单位来操作日期和时间。
  • 比较日期和时间。
  • 正确转换时区。

重要的是,您的库支持这些功能,否则尝试自己实现这些功能的诱惑就太大了。明确一点,如果你试图自己实现这些功能,你会失败。

不要用正则表达式解析自己的时间戳,不要在数字时间戳中添加秒数,因为它看起来像一个普通的数字,不要使用相等操作符比较日期和时间。这些库的存在是因为这些问题很难解决,在应用程序中重新发明轮子只会让你的轮子坏掉。

下面是我对符合这些标准的库的一些建议:

语言 图书馆
Python 标准库
Javascript 时刻而且时刻时区
Java 8及以上版本 标准库(java.time)
Java 7及以下版本 Joda-Time
斯威夫特 SwiftDate

如果你的语言没有被列出(因为我对它不够熟悉),只需搜索日期和时间库。很有可能你会找到一个好的图书馆,它能满足你所有的需求。

了解时间

我要分享的最后一点知识并不是特定于处理日期和时间,而是一种帮助我们避免问题的一般哲学,它适用于日期和时间处理,就像它适用于编程中的其他问题一样。

经常检查你的假设。

我们用大量的知识和更大的假设来处理每一个问题。在处理日期和时间时,检查您的假设以确保它们仍然适用于您的场景比以往任何时候都更重要。

这个列表《程序员相信时间的谎言》一书中给出了许多很好的例子,说明时间可能不是你想的那样。当你设计或开发一个以时间为中心的功能时,我建议你找一个伙伴,仔细检查一下这个列表,确保你避免了上面列出的陷阱。

时间漏洞是出了名的难以捕捉,更难测试。如果您在开发过程中考虑了这个列表,那么您就可以避免可能影响客户但他们可能无法捕捉到的细微错误(最糟糕的错误!)

时区

如果不提到时区,关于时间或日期的讨论就不完整。除了要熟悉上面列出的常见错误,还要熟悉时区的基本知识。

在处理时间问题时,时区将一直是一个痛点,即使你认为你已经“完全弄清楚了”。掌握一些时区知识可以帮助你集中思想,确保你在操作时间时不会犯任何逻辑错误。

不幸的是,没有办法完全避免在编程时存储和操作时间和日期的困难。但是,如果您遵循这些步骤并在脑海中使用这些知识,您可以通过减少必须编写的代码量并强迫自己使用不太可能引起问题的范例来简化任务。