27

我正在使用 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 这不是原始日期时间。

我知道,我不需要将 1360871255 格式化为 Ymd H:m:s 即可在 MYSQL 中使用它,但 1360871255 似乎不是我预期的时间(并且 MYSQL UNIX_TIMESTAMP 已返回)。

我想做的是一个简单的查询,它向我显示早于某个时间戳的条目,如下所示:

SELECT * FROM Entry WHERE created < 1360871255

但正如我之前提到的,查询结果不是预期的,因为 1360871255 似乎不是正确的时间。

我没有为 php.ini 中的 mysql 连接指定任何特殊时区。

有什么建议么?

4

5 回答 5

49

您的日期格式错误......i是分钟,而不是m(月)。

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

一些旁注:

  • 无需重新分配,即$unixTimestamp = $unixTimestamp;
  • 由于您使用的是 PHP > 5.3。您可能对新的DateTime对象感兴趣。
于 2013-02-14T20:42:22.903 回答
4

问题在于您编写的函数:

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() 足够有用。

于 2013-02-14T20:50:42.770 回答
2

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

于 2016-04-07T09:45:24.077 回答
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;
}
于 2015-11-17T12:32:06.687 回答
0

两者都没有。您应该将时间戳保存为INTorBIGINT因为如果您使用TIMESTAMPmysql 的格式,您将永远无法将其恢复为int. 你只能得到这样的东西1970-01-01 01:00:00

于 2015-12-27T14:59:25.617 回答