Mysql,PHP和UTC_TIMESTAMP()

时间:2015-07-01 00:38:57

标签: php mysql datetime

我知道这里有关于这个主题的一百个问题,但是我已经阅读了所有这些,但仍然没有得到它。

我使用UTC_TIMESTAMP()在设置表中存储我上次点击API的日期。列类型是mysql timestamp

UPDATE settings SET last_pull = UTC_TIMESTAMP();

当我从mysql中选择这个时,我得到以下内容:

mysql> select last_pull from settings;
+---------------------+
| last_pull           |
+---------------------+
| 2015-06-30 23:05:00 |
+---------------------+
1 row in set (0.00 sec)

似乎很清楚,因为我在太平洋时间,UTC时间提前8小时。因此,当我创建该记录时,当地时间是16:05:00。 (实际上是当地时间16:05 - 我在那里!)

令我困惑的是,当我从数据库中取出数据时,根据此处的每个答案,我应该可以使用默认的PHP datedatetime函数,假设我的时区设置正确,我应该从该时间戳得到当地时间(例如。date('Y-m-d H:i:s', $last_pull_value)应该返回2015-06-30 16:05:00)。

这个假设是不正确的?我已经验证了我的linux和PHP的时区是正确的,并且mysql也正确设置。

然而当我做的时候

$last_pull = new DateTime();
$last_pull->setTimestamp($row['last_pull']);                

var_dump($last_pull->format("c"));

它返回:

"2015-06-30 23:05:00"

然后我明确设置了时区:

$last_pull = new DateTime();
$last_pull->setTimestamp($row['last_pull']);    
$last_pull->setTimezone(new DateTimeZone('America/Los_Angeles'));           

var_dump($last_pull->format("c"));

它返回完全相同的东西(如果默认的TZ开头是正确的,这是有道理的。)

"2015-06-30 23:05:00"

我的问题是如何在API上次提取时获得本地时间?为什么赢得datetime函数返回16:05:00?

由于

1 个答案:

答案 0 :(得分:0)

如果在初始化时设置DateTime对象的时区,它将按预期工作。

$last_pull = new DateTime('2015-06-30 23:05:00', new DateTimeZone('UTC'));
var_dump($last_pull->format("c")); //string(25) "2015-06-30T23:05:00+00:00"
$last_pull->setTimezone(new DateTimeZone('America/Los_Angeles'));
var_dump($last_pull->format("c")); //string(25) "2015-06-30T16:05:00-07:00"

DateTime对象的文档指出,用于新日期时间对象的默认时区是您当前的时区 - http://php.net/manual/en/datetime.construct.php