我知道这里有关于这个主题的一百个问题,但是我已经阅读了所有这些,但仍然没有得到它。
我使用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 date
或datetime
函数,假设我的时区设置正确,我应该从该时间戳得到当地时间(例如。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?
由于
答案 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