PHP-MYSQL:将Unix时间戳转换为DateTime,反之亦然

时间:2013-02-14 20:39:16

标签: php mysql datetime unix-timestamp

即时通讯使用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

结果: created = 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);
}

当我打电话给DateTime(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连接指定任何特殊时区。

有什么建议吗?

5 个答案:

答案 0 :(得分:40)

您的date format错误... i是分钟,而不是m(月)。

return date("Y-m-d H:i:s", $unixTimestamp);

一些附注:

  • 无需重新分配,即$unixTimestamp = $unixTimestamp;
  • 因为你正在使用PHP&gt; 5.3。您可能对新的DateTime对象感兴趣。

答案 1 :(得分:3)

问题在于你写的功能:

return date("Y-m-d H:m:s", $unixTimestamp);

您可以在日期和时间部分指定月份(m)。你应该用 i 替换第二个 m ,这是在PHP中使用date()时的正确标志。

return date("Y-m-d H:i:s", $unixTimestamp);

根据您的需要,您可能会发现PHP函数strtotime()非常有用。

答案 2 :(得分:2)

为什么不简单地在mysql中使用FROM_UNIXTIME函数?

答案 3 :(得分:0)

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 :(得分:0)

两者都没有。您应该将时间戳保存为INTBIGINT,因为如果您使用TIMESTAMP格式的mysql,则永远不会将其恢复为int。你只能得到像1970-01-01 01:00:00这样的东西。