2013-02-14 141 views
21

即时通讯使用PHP 5.4.6和MySQL 5.5.29,我将UNIX TIMESTAMP转换为MYSQL DATETIME,反之亦然。 Mysql和php wun在同一台本地机器上。PHP-MYSQL:将Unix时间戳转换为DateTime,反之亦然

我有一个简单的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年2月14日二十时47分35秒 TS = 1360871255

所以现在我想要做的换句话说,我传递了一个UNIX时间戳,并希望将其与数据库中的条目进行比较。不幸的是我不能写一个可行的PHP脚本。我不知道为什么,但是当我米传递相同的时间戳(1360871255)到PHP我不同意这种方法得到2013年2月14日二十时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连接指定任何特殊的时区。

有什么建议吗?

回答

36

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

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

一些旁注:

  • 有没有必要重新分配,即$unixTimestamp = $unixTimestamp;
  • 由于您使用PHP> 5.3。您可能对新的DateTime对象感兴趣。
+1

该死的,你的权利... omg ...即时通讯如此愚蠢 – sockeqwe 2013-02-14 20:50:13

+3

@sockeqwe - 你并不愚蠢。你只是俯视它。它发生了。 – Greeso 2017-08-10 17:33:58

3

问题就出在你写的功能:可以在日期和时间部分

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

您指定月(M)。你应该使用PHP的日期()时,正确的标志更换第二几个小时。

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

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

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,因为如果您使用TIMESTAMP格式的mysql,则永远不会将其恢复为int。你只能得到这样的东西1970-01-01 01:00:00

1

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

+0

SQL语言很糟糕,所以使用MySQL扩展,特别是最近版本的扩展。使用实际的编程语言比使用其他应用程序不适合的元语言更容易和更好。 – Deji 2016-04-08 10:04:26