PHP-MYSQL:将 Unix 时间戳转换为 DateTime,反之亦然
Posted
技术标签:
【中文标题】PHP-MYSQL:将 Unix 时间戳转换为 DateTime,反之亦然【英文标题】:PHP-MYSQL: Converting Unix Timestamp to DateTime and vice versa 【发布时间】:2013-01-30 18:34:15 【问题描述】:我使用 php 5.4.6 和 mysql 5.5.29,我将 UNIX TIMESTAMP 转换为 MYSQL DATETIME 遇到了麻烦,反之亦然。 Mysql 和 php 在同一台本地机器上运行。
我有一个简单的mysql表
CREATE TABLE Entry(
id SERIAL PRIMARY KEY,
created DATETIME NOT NULL);
要插入数据,我使用 php PDO 和 mysql NOW()。这工作正常,正确的日期时间存储在数据库中。
我的计划是在客户端使用 unix 时间戳(在服务器端使用 php 和 mysql)。
所以我想向我的客户提供 unix 时间戳。 因此我使用 MySql UNIX_TIMESTAMP() 函数直接在查询中进行转换。
所以示例查询如下所示:
SELECT created, UNIX_TIMESTAMP(created) AS TS FROM Entry
结果: 创建 = 2013-02-14 20:47:35 TS = 1360871255
所以现在我想做另一种方式,我传递一个 UNIX 时间戳,并想将它与我的数据库中的条目进行比较。不幸的是,我无法编写有效的 PHP 脚本。我不知道为什么,但是当我将相同的时间戳 (1360871255) 传递给 PHP 时,我没有使用这种方法得到 2013-02-14 20:47:35:
public static function toDateTime($unixTimestamp)
return date("Y-m-d H:m:s", $unixTimestamp);
当我调用 toDateTime(1360871255) 时,将返回 2013-02-14 20:02:35,这不是原始的 DateTime。
我知道,我不需要将 1360871255 格式化为 Y-m-d H:m:s 即可在 MYSQL 中使用它,但 1360871255 似乎不是我预期的时间(并且 MYSQL UNIX_TIMESTAMP 已返回)。
我想要做的是一个简单的查询,显示比某个时间戳更早的条目,像这样简单:
SELECT * FROM Entry WHERE created < 1360871255
但正如我之前提到的,查询结果不是预期的,因为 1360871255 似乎不是正确的时间。
我没有为php中的mysql连接指定任何特殊时区。
有什么建议吗?
【问题讨论】:
【参考方案1】:为什么不简单地使用 mysql 中的 FROM_UNIXTIME 函数呢?
【讨论】:
【参考方案2】:两者都没有。您应该将时间戳保存为INT
或BIGINT
,因为如果您使用mysql 的TIMESTAMP
格式,您将永远无法将其恢复为int
。你只能得到这样的东西1970-01-01 01:00:00
。
【讨论】:
【参考方案3】:function format_date($str)
$month = array(" ", "Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec");
$y = explode(' ', $str);
$x = explode('-', $y[0]);
$date = "";
$m = (int)$x[1];
$m = $month[$m];
$st = array(1, 21, 31);
$nd = array(2, 22);
$rd = array(3, 23);
if(in_array( $x[2], $st))
$date = $x[2].'st';
else if(in_array( $x[2], $nd))
$date .= $x[2].'nd';
else if(in_array( $x[2], $rd))
$date .= $x[2].'rd';
else
$date .= $x[2].'th';
$date .= ' ' . $m . ', ' . $x[0];
return $date;
【讨论】:
【参考方案4】:您的date format 是错误的...i
是一分钟,而不是m
(几个月)。
return date("Y-m-d H:i:s", $unixTimestamp);
一些旁注:
无需重新分配,即$unixTimestamp = $unixTimestamp;
由于您使用的是 PHP > 5.3。您可能对新的 DateTime 对象感兴趣。
【讨论】:
@sockeqwe - 你不傻。你只是看错了。它发生了。【参考方案5】:问题出在你写的函数上:
return date("Y-m-d H:m:s", $unixTimestamp);
您在日期和时间部分都指定月份(m)。您应该将第二个 m 替换为 i,这是在 PHP 中使用 date() 时的正确小时标志。
return date("Y-m-d H:i:s", $unixTimestamp);
根据您的需要,您可能会发现 PHP 函数 strtotime() 足够有用。
【讨论】:
以上是关于PHP-MYSQL:将 Unix 时间戳转换为 DateTime,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章
将dateTime格式转换为Unix时间戳或将Unix时间戳转换为dateTime格式