我知道这是一个相当常见的问题,但我觉得我找到的答案并没有真正解决问题。我将概述我的具体用例,并呈现其他SO答案和网络信息的摘要。
对于我正在编写的服务,数据库条目在移动设备和我们的网站上都会创建和存储,并且需要进行双向同步。我们目前的目标是Android和iOS,它们都使用SQLite作为关系型数据库。服务器端使用Django和MySQL实现,但其他解决方案可能会在将来取代它。
根据这个SO答案中的想法,我们将实现同步: https://dev59.com/zW445IYBdhLWcg3wGmg6#5052208。对于同步,我们将使用时间戳,该时间戳仅由服务器设置并与客户端同步,用于最后同步日期和对象创建和更新的时间戳。由于对象引用用户在某些时间所做的事情,因此它们还具有时间戳信息。
我的问题只涉及用于这些时间戳的内部表示形式。 UI中的用户表示是内部表示的本地化和格式化版本。有很多不同的方式,无论在实现语言还是在使用的不同数据库中,都可以表示时间戳。经过相当多的研究,似乎只剩下两种有效的解决方案:
- Unix时间戳
- ISO8601
这个文章曾经在Hacker News上出现过(两次),建议使用Unix时间戳,并提出了一个非常好的论点。正如预期的那样,HN上的讨论在上述两个观点和其他方面都有所不同。
到目前为止,我的结论是Unix时间戳更容易处理,但似乎并不是Django中普遍采用的方法。我找到的几乎所有代码示例,从Django教程到许多其他网站,都在models.py中使用DateTimeField,该字段映射到SQL中的某种日期字段,具体术语取决于使用的数据库。
使用ISO8601日期进行传输和存储的缺点在于需要解析它们以创建相应实现语言的Date类型。这并不难,但有点烦人。对于我们使用的每种语言,您都需要一个(小)库或至少比您希望的更多的代码。它不是很漂亮,会创建依赖项,并且可能稍微慢一些。Unix时间戳在我所知道的任何语言中都没有这个问题。另一个问题是,在数据库中(和解析期间)使用“智能”日期或时间戳字段可能会让您陷入麻烦。关于时间问题导致混乱的问题有很多。我的链接限制已达到,因此我无法发布任何内容,但您很容易找到一些类似的链接。
我们可以使用简化格式,不包含时区信息,并始终使用UTC。我们只会使用UTC,但似乎如果您使用ISO8601,则最好使用一个通用理解和明确的格式。Unix时间始终在UTC中,因此您永远不必担心这个问题。
当然,ISO8601具有在查看原始数据库时可读性强的优点,我也不必在2038年之前重写几行代码,但这似乎并不能弥补缺点。
通过将事情写出来,我实际上已经得到了答案。无论如何,我很想知道其他人的想法以及您在自己的项目中做了什么。请简要概述您的用例,以便其他人可以更好地对您的输入进行分类。
谢谢!