PHP DateTime对象 - 时间戳和时区冲突

时间:2012-10-17 13:48:52

标签: php datetime timezone unix-timestamp

从DateTime对象中,我有兴趣在不同的TimeZones中获取时间。 正如DateTime::setTimezone doc中所解释的那样,当从字符串创建DateTime对象时,这很有效:

$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo $date->format('Y-m-d H:i:sP') . "\n";

$date->setTimezone(new DateTimeZone('Pacific/Chatham'));
echo $date->format('Y-m-d H:i:sP') . "\n";

$date->setTimezone(new DateTimeZone('UTC'));
echo $date->format('Y-m-d H:i:sP') . "\n";

echo $date->getTimestamp() . "\n";

上面的例子将输出:
2000-01-01 00:00:00 + 12:00 2000-01-01 01:45:00 + 13:45
1999-12-31 12:00:00 + 00:00 946641600个

现在是有趣的部分:如果我们拿起时间戳,并按照手动说明启动我们的DateTime对象。

$date2 = new DateTime('@946641600');

$date2->setTimezone(new DateTimeZone('Pacific/Nauru'));
echo $date2->format('Y-m-d H:i:sP') . "\n";

$date2->setTimezone(new DateTimeZone('Pacific/Chatham'));
echo $date2->format('Y-m-d H:i:sP') . "\n";

$date2->setTimezone(new DateTimeZone('UTC'));
echo $date2->format('Y-m-d H:i:sP') . "\n";

echo $date2->getTimestamp() . "\n";

在这里我们得到:// [编辑]哼哼...抱歉,这个输出是错误的...
1999-12-31 12:00:00 + 00:00 1999-12-31 12:00:00 + 00:00 1999-12-31 12:00:00 + 00:00 946641600个

UTC永远!我们不能再改变时区了!?!

是PHP还是我?版本5.3.15

2 个答案:

答案 0 :(得分:5)

好的,所以我自己也生气了。当然,我是一个错误的人...... 为了做到这一点,我只需要获取文档herehere中相关的位。
手册说:

// Using a UNIX timestamp.  Notice the result is in the UTC time zone.
$date = new DateTime('@946684800');
echo $date->format('Y-m-d H:i:sP') . "\n";

事实上,您可以使用setTimezone在您的时区再次获得时间(如果您的系统设置方式可以预期!):

$timezone = new DateTimeZone('Europe/Madrid');
$date->setTimezone(new DateTimeZone('Pacific/Chatham'));

请注意

$date =  new DateTime('@1306123200', new DateTimeZone('Europe/Madrid'));

会产生误导,因为无论如何你都会在UTC中! (是的,它在构造函数的doc中非常清楚地指定。所以要小心;)

谢谢@hakre 谢谢大家!

答案 1 :(得分:4)

只是你。就PHP来说,它一切都很好,花花公子,PHP手册很好地涵盖了这个:http://www.php.net/manual/en/datetime.construct.php