php时区:DateTime::createFromFormat忽略时区


php timezone: DateTime::createFromFormat ignores timezone

我在debian 8上使用php 5.6.7。在建立owncloud之后,我注意到由owncloud(而非apache)自行编写的日志具有错误的时区。

我对此进行了一些调查,似乎是这样的:

DateTime::createFromFormat("U.u", number_format(microtime(true), 4, ".", ""), 'Europe/Berlin');

这并不关心任何时区设置。我得到的不是欧洲/柏林的时间(+1/+2),而是UTC的时间。

/etc/php5/apache2/php.ini中,我设置了"date.timezone = "Europe/Berlin",并且系统时间(debian)也是正确的。

即使我运行下面这样的东西,我也会得到相同的输出(UTC):

 $time=DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true)), new DateTimeZone('UTC'));
 echo $time->format('c') . "'n";
 $time=DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true)), new DateTimeZone('Europe/Berlin'));
 echo $time->format('c') . "'n";

对这个问题有什么想法吗?

引用关于DateTime::createFromFormat():的PHP手册

注意:当时间参数包含UNIX时间戳(例如946684800)或指定时区(例如2010-01-28T15:00:00+02:00)时,将忽略时区参数和当前时区。

如果要更改时区,则必须在创建对象后使用setTimezone()方法。

使用微时间创建时会忽略时区,因为在绝大多数情况下,unix时间戳和微时间都存储为UTC。在createFromFormat之后使用setTimezone更新时区:

$micro = microtime(true);
$dt = DateTime::createFromFormat('U.u', $micro);
$dt->setTimezone(new DateTimeZone('America/Los_Angeles'));