php 像 UTC 一样编译时区 Europe/Berlin

php compiles timezone Europe/Berlin like UTC

今天我一直在为一个奇怪的问题而苦苦挣扎。出于某种原因,我的服务器假装时区 'Europe/Berlin' 是 UTC(应该是 UTC+1)。例如,如果我将时区设置为 'Europe/Brussels',它会正确转换时间。

我创建了一些虚拟代码来测试我的服务器和在线编译器。虽然编译器工作(我已经使用 http://sandbox.onlinephpfunctions.com/),但我的服务器仍然存在这个问题。

代码如下:

<?php
$time = 'now';

$timezone1 = 'Europe/London';
$timezone2 = 'Europe/Berlin';
$timezone3 = date_default_timezone_get();
$timezone4 = 'Europe/Brussels';

$dateTime1 = new \DateTime($time, new DateTimeZone($timezone1));
$timeParsed1 = $dateTime1->format('Y-m-d H:i:sP');

$dateTime2 = new \DateTime($time, new DateTimeZone($timezone2));
$timeParsed2 = $dateTime2->format('Y-m-d H:i:sP');

$dateTime3 = new \DateTime($time, new DateTimeZone($timezone3));
$timeParsed3 = $dateTime3->format('Y-m-d H:i:sP');

$dateTime4 = new \DateTime($time, new DateTimeZone($timezone4));
$timeParsed4 = $dateTime4->format('Y-m-d H:i:sP');

echo($timezone1 . ': ' . $timeParsed1 . '<br>' . $timezone2 . ': ' . $timeParsed2 . '<br>' . $timezone3 . ': ' . $timeParsed3 . '<br>' . $timezone4 . ': ' . $timeParsed4);
?>

这是生成的输出:

Europe/London: 2017-01-26 01:24:18+00:00
Europe/Berlin: 2017-01-26 01:24:18+00:00
UTC: 2017-01-26 01:24:18+00:00
Europe/Brussels: 2017-01-26 02:24:18+01:00

我一直在努力寻找这个问题的原因,并在 Whosebug 上进行了搜索,但我找不到原因。这是我的 phpinfo() 的 link:http://arma.jianji.de/phpinfo.php

这是我服务器上的虚拟代码:http://arma.jianji.de/phptest.php

我最近使用 Ubtuntu 16 LTS 和 Plesk Onyx 设置了服务器。服务器默认时区设置为伦敦。

不幸的是,我一直找不到原因。你有什么想法吗?

提前感谢您的帮助!

更新

因为这已经被提出了很多,我创建了一个测试,我使用以下方法设置了默认时区:

date_default_timezone_set('Europe/Brussels');

此外,我在 php.ini 中添加了 "Europe/London" 作为默认时区。

问题仍然存在:http://arma.jianji.de/phptest_default.php

正如@RuslanOsmanov 所指出的,Europe/Berlin 的时区数据不正确。我能够通过使用

来验证这一点
zdump -V Europe/Berlin | grep 2017

为了解决这个问题,我重新安装了 tzdata,解决了这个问题。

 apt-get --reinstall install tzdata