PHP时区:DateTime :: createFromFormat忽略时区

5

我正在使用Debian 8上的PHP 5.6.17。在设置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";

有关这个问题的任何想法?

2个回答

8

好的,谢谢!我已经让我的测试代码工作了。现在我必须检查owncloud的问题是什么。非常感谢。 - Sebastian
如果您想感谢我,请点赞并接受我的答案。 :) - Narf
4
用 PHP 从时间戳创建 DateTime 对象,又是一个让人摸不着头脑的时刻。 - Konrad Gałęzowski

3

使用microtime创建时忽略时区,因为在绝大多数情况下,Unix时间戳和microtime都是以协调世界时(UTC)存储的。在createFromFormat之后使用setTimezone来更新时区:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接