我知道这是一个很常见的问题,但我不认为我找到的答案真正解决了这个问题。我将概述我的具体用例,并提供从其他这样的答案和网络周围的信息摘要。
对于我正在编写的服务,数据库条目被创建并存储在移动设备和我们的网站上,并且需要以两种方式进行同步。我们目前的目标是安卓和iOS,它们都使用sqlite作为关系数据库。服务器端是使用MySQL使用Django实现的,但其他解决方案可能会在将来取代它。
同步将按照这个答案:https://stackoverflow.com/a/5052208/2076094中概述的想法来实现。为了同步,我们将使用一个时间戳,该时间戳仅由服务器设置,并与客户端同步,last_synced_date和时间戳用于对象创建和更新。由于对象引用的是用户在特定时间所做的事情,所以它们也有时间戳信息。
我的问题只涉及用于这些时间戳的时间的内部表示。UI中的用户表示是内部表示的本地化和格式化版本。在实现语言和用于表示时间戳的不同数据库中,有许多不同的方式。经过相当多的研究,似乎只剩下有效的解决办法了:
“黑客新闻”上的这个文章 (两次)建议使用UNIX,并给出了一个很好的论据。正如预期的那样,关于HN的讨论围绕上述两点和随后的一些观点有相当大的分歧。
到目前为止,我的结论是,Unix时间戳更容易处理,但在Django中似乎并不常见。我发现的几乎每个代码示例,从Django教程到许多其他站点,都使用models.py中的一个models.py,它被映射到SQL中的某种日期字段,具体术语取决于所使用的数据库。
使用ISO8601日期进行传输和存储的缺点是,需要对它们进行解析,以创建相应的实现语言的日期类型。这并不难,但有点烦人。对于我们使用的每一种语言,您要么需要一个(小的)库,要么至少需要比您希望的更多的代码。它不是很漂亮,会创建依赖关系,而且可能会稍微慢一些。在我所知道的任何语言中,Unix时间戳都没有这个问题。
另一件事是,在数据库中使用“智能”日期或时间戳字段(以及解析期间)很容易陷入麻烦。有很多问题,所以关于时间魔术,把事情搞砸了。我的链接限制已经达到,所以我不能发布任何链接,但是您会很容易找到;)
我们可以使用一种不包括时区信息的简化格式,并且总是使用UTC。无论如何,我们只会使用UTC,但是如果您使用ISO8601,您最好使用一种普遍理解和明确的格式。Unix时间总是在UTC,所以您不必担心这个问题。
当然,当您查看原始数据库时,ISO8601具有可读性强的优点,我在2038年之前不必重写几行代码,但这似乎无法弥补缺点。
我似乎已经有了答案。)不管怎样,我很想知道别人是怎么想的,你在你自己的项目中做了什么。请给你的用例一个简短的大纲,以便其他人可以更好地分类你的输入。
谢谢!
发布于 2013-09-29 12:13:44
无论知道什么,都很难找到关于时间数据类型或时间标准格式的任何信息。在过去的几天里,我一直在努力选择正确的时间格式。和您一样,我也在移动设备和web服务器中进行编码(更不用说还有桌面应用程序了)。
我问自己的主要问题是,“我如何才能在移动设备、web服务器(API,或您想称之为的任何东西)和桌面应用程序之间有一个无缝的体验?如何才能在事件发生的时间和之间保持一致?如何确保在这个软件星座的不同级别上对这个瞬间的表示是相同的?
正如您可能知道的,使用移动设备进行编码意味着您正在使用SQLite数据库,而web应用程序主要意味着MySQL。我对深感失望,因为我知道我能想到的最大的麻烦之一就是用时间数据从一个数据库转到另一个数据库。选择什么?DateTime?时间戳?天哪,SQLite没有内置的时间数据类型…统一时间?好的,没问题,当然MySQL不使用UNIX作为标准的…太简单了,…
我学到的是…如果您想将数据放在时间线上,并且说这是发生此事件的时间线上的点,最好使用时间戳(无论是UNIX还是MySQL样式,也就是ISO8601)。
人类的可读性对我来说只是一个细节。没有人应该读取数据库表,计算机应该读取数据库表,而您确实告诉计算机按照人类能够理解的顺序处理数据。
但是的问题是“什么是时区?”弹出…Well…它糟透了…但是嘿,我会在网上找答案的。
我自己我很惊讶MySQL没有使用UNIX ,我认为这是我们可以拥有的最标准和最一致的时间格式。
我真的认为围绕这些选择的文档和标准是有限的,…我现在正在考虑写一些关于如何处理MySQL和SQLite时间的文章。我在这件事上浪费了一周的时间,试图弄清楚如何使它变得干净和简单,最后得出的结论是,有了可用的文档,你就不能…了
我可能错了…
无论如何,看看这段视频,它展示了在MySQL中处理时间戳数据的斗争:
http://www.youtube.com/watch?v=fp-etlirjbo
https://stackoverflow.com/questions/15554586
复制相似问题