PHP-MYSQL: 将Unix时间戳转换为日期时间和反向转换

29

我正在使用PHP 5.4.6和MySQL 5.5.29,将UNIX时间戳转换为MYSQL日期时间以及反向转换时遇到了问题。MySQL和PHP都运行在同一台本地机器上。

我有一个简单的MySQL表格。

CREATE TABLE Entry(
id SERIAL PRIMARY KEY,
created DATETIME NOT NULL);

我使用php PDO和mysql NOW()来插入数据,这很好用,正确的日期时间被存储在数据库中。

我的计划是在客户端(服务器端使用php和mysql)上使用Unix时间戳。

因此,我想向客户端提供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);
}

当我调用toDateTime(1360871255)时,会返回2013-02-14 20:02:35,这并不是原始的日期时间。

我知道在MYSQL中使用1360871255时,不需要将其格式化为Y-m-d H:m:s,但是1360871255似乎不是我预期的时间(而MYSQL UNIX_TIMESTAMP返回的是它)。

我想做的是一个简单的查询,显示早于特定时间戳的条目,类似于以下这样简单的语句:

SELECT * FROM Entry WHERE created < 1360871255

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

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

有什么建议吗?

5个回答

51

您的日期格式不正确... i是分钟,而不是m(月份)。

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

补充一下:

  • 无需重新分配,即$unixTimestamp = $unixTimestamp;
  • 由于您使用的是PHP > 5.3,您可能会对新的DateTime对象感兴趣。

3
@sockeqwe - 你不是愚蠢的。你只是忽略了它。这种事情时有发生。 - Greeso

4
问题出在你编写的函数中:
return date("Y-m-d H:m:s", $unixTimestamp);

在日期和时间部分都要指定月份(m)。当使用PHP中的date()函数时,应该将第二个m替换为正确的小时标志i

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

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


2
为什么不直接在MySQL中使用FROM_UNIXTIME函数?

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;
}

0

两者都不是。你应该将时间戳保存为INTBIGINT,因为如果你使用mysql的TIMESTAMP格式,你将永远无法将其转换回int。你只能得到类似于1970-01-01 01:00:00这样的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接