im使用php 5.4.6和MySQL 5.5.29时,我遇到了将UNIX TIMESTAMP转换为MySQL DATETIME的问题,反之亦然。Mysql和php-wun在同一台本地机器上。
我有一个简单的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:35TS=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中使用它,但136087125似乎不是我预期的时间(MYSQL UNIX_TIMESTAMP已经返回)。
我想做的是一个简单的查询,它向我显示比某个时间戳旧的条目,类似于这样简单的东西:
SELECT * FROM Entry WHERE created < 1360871255
但正如我之前提到的,查询结果不是预期的,因为1360871255似乎不是正确的时间。
我没有为php中的mysql连接指定任何特殊的时区。
有什么建议吗?
您的日期格式错误。。。i
表示分钟,而不是m
(月)。
return date("Y-m-d H:i:s", $unixTimestamp);
一些旁注:
- 无需重新分配,即
$unixTimestamp = $unixTimestamp;
- 由于您使用的是PHP>5.3。您可能对新的DateTime对象感兴趣
问题在于您编写的函数:
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()足够有用。
为什么不简单地在mysql中使用FROM_UNIXTIME函数?
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;
}
两者都没有。您应该将时间戳保存为INT
或BIGINT
,因为如果您使用mysql的TIMESTAMP
格式,您将永远无法将其恢复为int
。你只能得到这样的1970-01-01 01:00:00
。