当前位置: 首页 > 知识库问答 >
问题:

时间戳:iso8601 vs unix时间戳

鞠源
2023-03-14

我知道这是一个非常常见的问题,但我觉得我找到的答案并没有真正解决问题。我将概述我的具体用例,并对来自其他SO答案和网络的信息进行总结。

对于我正在编写的服务,数据库条目被创建并存储在移动设备和我们的网站上,需要以两种方式同步。我们目前的目标是Android和iOS,它们都使用sqlite作为关系数据库。服务器端是使用Django和MySQL在Python中实现的,但将来可能会有其他解决方案取代它。

同步将按照此SO答案中概述的想法来实现:https://stackoverflow.com/a/5052208/2076094.对于同步,我们将使用仅由服务器设置并同步到客户端的时间戳、对象创建和更新的last_synced_date和时间戳。由于对象引用了用户在特定时间所做的事情,因此它们也具有时间戳信息。

我的问题只涉及用于这些时间戳的时间的内部表示。UI中的用户表示是内部表示的本地化和格式化版本。在实现语言和用于表示时间戳的不同数据库中有很多不同的方法。经过相当多的研究,似乎只剩下有效的解决方案:

  • Unix时间

这篇发表在《黑客新闻》(Hacker News)(两次)上的文章建议使用UNIX时间,并提出了一个很好的论点。正如预期的那样,关于HN的讨论围绕上述两点有很大分歧,然后是一些分歧。

到目前为止,我的结论是,Unix时间戳更容易处理,但在Django中似乎并不常见。我发现的几乎每个代码示例,从Django教程到许多其他站点,都在模型中使用DateTime字段。py映射到SQL中的某种日期字段,确切的术语取决于所使用的数据库。

使用ISO8601日期进行传输和存储的缺点是,需要对它们进行解析,以创建相应实现语言的日期类型。这并不难,但有点烦人。对于我们使用的每一种语言,您要么需要一个(小)库,要么至少需要比您希望的更多的代码。它不是很漂亮,会产生依赖关系,可能会稍微慢一点。Unix时间戳在我所知道的任何语言中都没有这个问题。

另一件事是,使用数据库中的“智能”日期或时间戳字段(以及在解析过程中)很容易遇到麻烦。关于把事情搞砸的时间魔法有很多问题。我的链接已达到限制,因此我无法发布任何链接,但您可以很容易地找到一些;)

我们可以使用不包含时区信息的简化格式,并且始终使用UTC。无论如何,我们只会使用UTC,但如果您使用ISO8601,您似乎还不如使用一种普遍理解且明确的格式。Unix-time始终在UTC中,因此您永远不必担心这一点。

当然,当您查看原始数据库时,ISO8601具有可读性的优势,我不必在2038年前重写几行代码,但这似乎并不能弥补其缺点。

似乎通过写东西,我实际上已经有了答案;)无论如何,我很想知道别人怎么想,你在自己的项目中做了什么。请简要概述您的用例,以便其他人可以更好地分类您的输入。

谢谢

共有1个答案

罗甫
2023-03-14

很难找到任何关于时间数据类型或时间标准格式的信息,无论它是什么。在过去的几天里,我自己一直在努力选择正确的时间格式。就像你一样,我也在移动设备和Web服务器中编码(更不用说还会有一个桌面应用程序)。

我问自己的主要问题是“如何在移动设备、web服务器(API,或任何你想称之为API的东西)和桌面应用程序之间获得无缝体验?如何在事件发生时保持一致,以及如何确保在这个软件群的不同级别上,这个瞬间的表示是相同的?”?

正如您可能知道的,使用移动设备编码意味着您正在使用SQLite数据库,而web应用程序主要意味着MySQL。我非常失望地知道,我所能想象到的最头疼的事情之一就是用时间数据从一个数据库转到另一个数据库。选择什么?约会时间?时间戳?哦,天哪,SQLite没有内置的时间数据类型…Unix时间?好的,没问题,当然MySQL不使用UNIX时间作为标准…太简单了…

我学到的是……如果你想把数据放在一个时间线上,并说这是这个事件发生的时间线上的点,最好使用时间戳(无论是UNIX还是MySQL风格,也就是ISO8601)。

人类可读对我来说只是一个细节。任何人都不应该读取数据库表,计算机会读取,你确实告诉计算机按照人类可以理解的顺序处理数据。

但是后来“时区是什么”的问题出现了...嗯...

我自己我很惊讶MySQL不使用UNIX时间,我认为这是一个人可以拥有的最标准和最一致的时间格式。

我真的认为围绕这些选择的文档和标准是有限的……我现在正在考虑写一些关于如何使用MySQL和SQLite处理时间的东西。我确实在这件事上浪费了半个星期的时间,试图理解如何让它变得简洁明了,结论是,有了可用的文档,你就无法…

我可能错了…

无论如何,看看这个视频,它展示了在MySQL中处理时间戳数据的困难:

http://www.youtube.com/watch?v=fp-etlirjbo

 类似资料:
  • 本文向大家介绍sqlite时间戳转时间语句(时间转时间戳),包括了sqlite时间戳转时间语句(时间转时间戳)的使用技巧和注意事项,需要的朋友参考一下 下面是具体的实现代码:

  • 我有一个Flink程序,它接受两个流,即数据/传感器读数流和警报规则流。我正在广播规则流,并将其连接到数据流以生成动态警报。ProcessingTime的一切都很好,但EventTime却不行。我已经分配了时间戳 > 当两个流(即带有时间戳的流)同时出现时,如何使用“EventTime”生成警报 我是否也必须为我的规则流分配时间戳和水印? 因为我的规则流只有在有任何添加/修改时才会有记录。是否有任

  • 我正在尝试使用Joda在一个简单的Java程序中获取UTC时间戳: 程序输出如下: 毫秒值是正确的UTC时间(即用时区确认)第二个值是时区。 我需要的是UTC值不变为(即独立于TZ),用于数据库写入。这可能吗? 我知道是本地日期(GMT-4),是UTC(GMT-0)。日期的输出值如下: 我尝试了所有组合,试图将的UTC值作为java.sql.TimeStamp: 用于测试的打印输出: 第一行是正确

  • 问题内容: 我有一列称为“ s_timestamp”。 如何返回时间戳中具有当天的所有记录? 例如, 我想要以下输出: 让我知道是否不清楚。 问题答案: 只是使用。例如 日期() CURDATE()

  • 程序的一个通常需求是计算从Unix起始时间开始到某个时刻的秒数,毫秒数,微秒数等。 我们来看看Go里面是怎么做的。 package main import "fmt" import "time" func main() { // 使用Unix和UnixNano来分别获取从Unix起始时间 // 到现在所经过的秒数和微秒数 now := time.Now() secs

  • 假设我有一个时间戳值。 编辑 现在我正在使用获取上述时间的毫秒值; 根据Java文档,getTime()方法的定义是