如何显示 DST 国家/地区的更新时间?

How to show updated time for DST countries?

我正在显示不同时区的时间,问题是我的服务器是 运行 PHP v5.3.25 而在我的本地计算机上我有 v5.5.9

当我设置一个特定的时区并显示它的时间时,我的本地计算机显示正常,但服务器在 DST 期间没有增加小时数。

date_default_timezone_set('Europe/London');
echo date('Y-m-d H:i:s');

我已经为它创建了一个解决方法:

date_default_timezone_set('Europe/London');
$is_dst = date('I');
if($is_dst) {
    $date = date('Y-m-d H:i:s', strtotime('+1 hours', strtotime(date('Y-m-d H:i:s'))));
} else {
    $date = date('Y-m-d H:i:s');
}
echo $date;

此解决方法适用于英国,但我想要一个动态且有效的解决方案来显示时间。此外,当我使用 PHPMailer 发送电子邮件时,由于这个夏令时问题,它在接收端显示错误的时间戳。

这不是处理 DST 的可靠方法,因为有些地方不使用整点时间,或者根本没有。 The DateTime extension 为您处理所有这些,并且自 PHP 5.2 以来一直存在,因此您应该能够这样做:

date_default_timezone_set('Etc/UTC');
$date = new DateTime(null, new DateTimeZone('Europe/Amsterdam'));

通常您应该始终使用 UTC 作为内部时间戳,否则很容易混淆。每当您需要向他们显示某些内容时转换为用户的时区 - 虽然这当然意味着您需要知道用户的时区,并且通常您需要从 JS 获取它,因为它不包含在 $_SERVER 中,虽然您可以从 geoip 数据中推断出它,或者要求用户在您的应用的首选项中明确指定一个区域。

原来是服务器时间与UTC时间不同步。我向我的托管服务提供商开了一张票,他们为我启动了 NTP 服务。所以问题不在于 PHP 而在于 NTP 服务被停止。现在我的服务器时间同步了,夏令时也开始了。