如何使用 MySQL 存储 UNIX 时间戳

Posted

技术标签:

【中文标题】如何使用 MySQL 存储 UNIX 时间戳【英文标题】:How to store UNIX timestamps with MySQL 【发布时间】:2017-02-15 16:34:30 【问题描述】:

一些背景:

我的网站在很大程度上依赖于协调各种不同时区的用户。

我在服务器端使用 Carbon 处理我的时区转换和计算,在客户端使用 moment.js。

因此,设计选择将所有日期时间(例如事件的开始时间)存储为 unix 时间戳

问题

我对“时间戳”的定义有点困惑。在 phpMyAdmin 中,时间戳不是 unix 时间戳,而是日期格式:

2016-10-06 20:50:46

因此,如果您想拥有当前时间戳的默认字段,那么您将获得 GMT 中的当前日期。

与 unix 时间戳整数相比,这使得转换回用户时区变得更加复杂......

问题:

我应该将我的 unix 时间戳存储为什么字段类型,目前我使用的是int(11),默认为none。通过扩展...有没有办法在 mysql 中默认存储当前的 unix 时间戳(例如 1475971200)?

【问题讨论】:

您可以通过将 datetime 从和转换为 unix 时间戳来规避问题。因此,要插入 unix 时间戳,您将在表中创建一个 DATETIME 字段,并将 unix 时间戳转换为 FROM_UNIXTIME(1514789942)。然后,当您想在 unix timstamp 中检索值时,您可以执行 SELECT UNIX_TIMESTAMP(my_datetime_field) 【参考方案1】:

Unix 时间戳是一个大整数(自 1970-01-01 00:00:00 UTC 以来的秒数),因此 INT(11) 是正确的数据类型。

不幸的是,我认为没有任何方法可以指定插入当前时间戳的默认值。您需要在插入时显式调用 UNIX_TIMESTAMP() 并使用它。 DEFAULT 规范中不允许函数调用。

【讨论】:

为什么是11个字节? 不是11个字节,是十进制的11位,也就是32位数字能显示多少位。 INT(11) 不会成功,只是试了一下,将 2147483647 存储为 1623925731158。BIGINT 成功了。 @DBencz UNIX_TIMESTAMP() 以秒为单位,MySQL 时间戳函数仅支持高达 2**31-1 的值,它适合 INT(11)。您似乎添加了 3 位数字(毫秒)。【参考方案2】:

您可以继续使用无符号 INT,但您必须手动设置插入时的时间戳 (UNIX_TIMESTAMP())。

或者您可以使用带有默认 CURRENT_TIMESTAMP 的 TIMESTAMP 类型(在后台存储为 int)并在选择时将其转换为 int:SELECT UNIX_TIMESTAMP(foo_field) FROM foo_table

参考 - Is it possible to create a column with a UNIX_TIMESTAMP default in MySQL?

【讨论】:

【参考方案3】:

实际上,您必须使用bigintvarchar,因为int(11) 的最大值为2'147'483'647(更多信息here)。

然后,正如前面的答案所说,您必须手动插入UNIX_TIMESTAMP()

【讨论】:

Int(11) 就足够了,不需要 bigint。 unix 时间戳不能超过 19. 2038 年 1 月,因为它通常是有符号的 32 位整数。见en.wikipedia.org/wiki/Year_2038_problem

以上是关于如何使用 MySQL 存储 UNIX 时间戳的主要内容,如果未能解决你的问题,请参考以下文章

从 Python 将 unix 时间戳插入 MySQL [重复]

如何使用 PHP 将 MySQL 时间转换为 UNIX 时间戳?

如何将 SQL Server SMALLDATETIME 转换为 Unix 时间戳?

如何使用 Shell 将 ISO 8601 时间戳转换为 Unix 时间戳?

Mysql 之间使用,Unix 时间戳 [重复]

mysql 中怎么把时间戳转换成正常时间