解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别相关的知识,希望对你有一定的参考价值。

参考技术A mysql
中:UNIX_TIMESTAMP(),
UNIX_TIMESTAMP(date)
若无参数调用,则返回一个Unix
timestamp
('1970-01-01
00:00:00'
GMT
之后的秒数)
作为无符号整数。若用date
来调用UNIX_TIMESTAMP(),它会将参数值以'1970-01-01
00:00:00'
GMT后的秒数的形式返回。date
可以是一个DATE
字符串、一个
DATETIME字符串、一个
TIMESTAMP或一个当地时间的YYMMDD
或YYYMMDD格式的数字。
mysql>
SELECT
UNIX_TIMESTAMP();
->
882226357
mysql>
SELECT
UNIX_TIMESTAMP('1997-10-04
22:23:00');
->
875996580

UNIX_TIMESTAMP被用在
TIMESTAMP列时,
函数直接返回内部时戳值,
而不进行任何隐含的
“string-to-Unix-timestamp”转化。假如你向UNIX_TIMESTAMP()传递一个溢出日期,它会返回
0,但请注意只有基本范围检查会被履行
(年份从1970

2037,
月份从01到12,日期从
01
到31)。
这里我们可以使用
FROM_UNIXTIME(unix_timestamp),
FROM_UNIXTIME(unix_timestamp,format)来格式化一个UNIX_TIMESTAMP()时间戳,它将返回'YYYY-MM-DD
HH:MM:SS'或YYYYMMDDHHMMSS
格式值的unix_timestamp参数表示,具体格式取决于该函数是否用在字符串中或是数字语境中。
若format
已经给出,则结果的格式是根据format
字符串而定。
format
可以包含同DATE_FORMAT()
函数输入项列表中相同的说明符。
mysql>
SELECT
FROM_UNIXTIME(875996580);
->
'1997-10-04
22:23:00'
mysql>
SELECT
FROM_UNIXTIME(875996580)
+
0;
->
19971004222300
mysql>
SELECT
FROM_UNIXTIME(UNIX_TIMESTAMP(),
->
'%Y
%D
%M
%h:%i:%s
%x');
->
'2003
6th
August
06:22:58
2003'
php中:time()
time
--
返回当前的
Unix
时间戳
返回自从
Unix
纪元(格林威治时间
1970

1

1

00:00:00)到当前时间的秒数。
从字面上理解他们是一样的,都是返回
自从
Unix
纪元到当前时间的秒数。
笔者在同一台服务器上做了一个测试,发现两者返回的结果是一样的

在mysql中用
FROM_UNIXTIME(
1156219870
,'%y-%m-%d'
)
和php中用date(
"y-m-d",1156219870
)结果也是一样相同的!唯一不肯确定的是那一个反应更加快速。不过我还是倾向与用php中的time()函数!

unix_timestamp (MySQL) 的数据类型是啥?

【中文标题】unix_timestamp (MySQL) 的数据类型是啥?【英文标题】:What is the data type for unix_timestamp (MySQL)?unix_timestamp (MySQL) 的数据类型是什么? 【发布时间】:2011-05-06 18:32:18 【问题描述】:

我应该使用什么数据类型来保存 unix_timestamp 值 (MySQL)?

【问题讨论】:

dev.mysql.com/doc/refman/5.0/en/datetime.html 时间戳和unix_timestamp一样吗? @user239431:UNIX_TIMESTAMP 是一个 MySQL 函数:dev.mysql.com/doc/refman/5.1/en/… @user239431 不,不是。 unix_timestamp 它返回自 '1970-01-01 00:00:00' 以来的秒数和 (mysql) 时间戳记一个 YYYYMMDDHHMMSS 或 YYMMDDHHMMSS 格式的数字。如果您的应用程序中确实需要时间戳(unix),您可以使用 NOW() 保存当前日期时间并使用 UNIX_TIMESTAMP() 返回 unix_timestap,并且仍然拥有 MySQL 日期函数的全部功能,请参阅dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html 也值得一读dev.mysql.com/doc/refman/5.1/en/… 【参考方案1】:

类型是整数,如:

int(11) 

适用于索引和条件,如> < =

【讨论】:

如果您使用 INT,您需要记住签名版​​本仅从 -2147483648 到 2147483647,上限触发year 2038 bug。您可以使用 INT(11) UNSIGNED 或 BIGINT - 后者有 some caveats,但它是 massive。我个人觉得 MySQL 的内置函数更安全,但大型数据集的索引和比较函数可能会影响你。 为了后代我 +1 William Turrell 的评论。从我的角度来看,UNSIGNED INT 将是可行的方法,但最真实的答案将取决于您将数据库信息提取到的语言(如果从头开始编码)。示例:如果您是 Java 商店,UNSIGNED INT 映射到 java.lang.Long(请参阅此处的表 5.2,MySQL + Java 用户:dev.mysql.com/doc/connector-j/en/…)。这样,您可以在数据库中节省一些空间,同时确保您不会编写会在 2038 年遇到错误的代码。好点@WilliamTurrell。 就 2038 漏洞而言,将int(11) 中的 11 增加到 12 或 13 不是避免这种情况的合理措施吗? @BradHein 11 是或显示,而不是可以存储的大小。 UNSIGNED int 的最大值始终为 4294967295。请参阅dev.mysql.com/doc/refman/5.7/en/integer-types.html。将该数字输入一个纪元转换器,然后查看该字段可以保存大约 2106 年 2 月 7 日的日期。epochconverter.com/… 可以存储的时间是 unsigned 标志的两倍。 2038-1970=68 年,2106-1970=136 年。【参考方案2】:

您想使用TIMESTAMP data type。 它存储为一个纪元值,但 MySQL 将该值显示为 'YYYY-MM-DD HH:MM:SS'。

【讨论】:

我相信问题是询问哪种 MySQL 数据类型最适合存储 epoch 值。 TIMESTAMP 不是这里的答案,因为 TIMESTAMP 唯一可接受的值是月/日/年字符串。来源:dev.mysql.com/doc/refman/8.0/en/date-and-time-literals.html【参考方案3】:

MySql DateTime 数据类型以 'YYYY-MM-DD HH:MM:SS' 格式存储日期,范围从 '1000-01-01 00:00:00' 到 '9999- 12-31 23:59:59'。

MySql TIMESTAMP 数据类型以 'YYYY-MM-DD HH:MM:SS' 格式存储日期,范围从 '1970-01-01 00:00:01' UTC 到 '2038 -01-19 03:14:07' UTC。

Unix TIMESTAMP 是自 1970-01-01 以来的秒数,如果您想将 unix Timestamp 存储在 mysql db 中,您应该使用带有属性 UNSIGNEDint(11)(仅允许正数),如果你想保存微秒数,你应该使用bigint(20),..

如果您想在选择查询中以可读格式获取unixtimestamp 你可以使用

SELECT FROM_UNIXTIME(CAST(yourtable.start_time as UNSIGNED)) as date_time

如果您使用的是php,您可以使用:

$unixtimestamp= time();//1544619186

echo(date("Y-m-d", $unixtimestamp));//2018-12-12

如果您想在 Javascript 中使用 本地时区 显示日期时间,请使用此功能

  function timeConverter(UNIX_timestamp)
        var date = new Date(UNIX_timestamp*1000);
        var year = date.getFullYear();
        var month = ("0"+(date.getMonth()+1)).substr(-2);
        var day = ("0"+date.getDate()).substr(-2);
        var hour = ("0"+date.getHours()).substr(-2);
        var minutes = ("0"+date.getMinutes()).substr(-2);
        var seconds = ("0"+date.getSeconds()).substr(-2);
    
        return year+"-"+month+"-"+day+" "+hour+":"+minutes+":"+seconds;
    
   console.log(timeConverter(value));// 2018-14-12 13:11:33

(在这种情况下,服务器应按原样返回 unixTimestamp: SELECT yourtable.start_time as date_time)

【讨论】:

【参考方案4】:

BIGINT UNSIGNED NOT NULL

以秒为单位的纪元表示可以适应INT(11) 如果时间戳有毫秒,可以使用INT(20)

【讨论】:

以上是关于解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别的主要内容,如果未能解决你的问题,请参考以下文章

unix_timestamp (MySQL) 的数据类型是啥?

mysql default unix_timestamp(now())

MySQL中from_unixtime和unix_timestamp处理数据库时间戳转换问题-案例

MySQL中from_unixtime和unix_timestamp处理数据库时间戳转换问题-案例

mysql 时间戳函数FROM_UNIXTIME和UNIX_TIMESTAMP函数的使用说明

MYSQL int型日期处理