如何使用MySQL存储UNIX时间戳

时间:2016-10-06 19:37:27

标签: php mysql date datetime unix

某些背景:

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

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

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

问题

我对#34; timestamp"的定义感到有点困惑。在PHPMyAdmin中,时间戳不是unix时间戳,而是日期格式:

2016-10-06 20:50:46

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

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

问题:

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

4 个答案:

答案 0 :(得分:14)

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

不幸的是,我认为没有办法指定插入当前时间戳的默认值。插入时需要明确调用UNIX_TIMESTAMP(),并使用它。 DEFAULT规范中不允许进行函数调用。

答案 1 :(得分:2)

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

或者您可以将TIMESTAMP类型与默认的CURRENT_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?

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

对于最大位数为4294967295,当前时间戳为1553244188的10位数字,int(10)可以。在整数字段中,我对查询使用默认的默认整数0(未设置)。