【问题标题】:How do I account for daylight savings time when retrieving current time in PHP?在 PHP 中检索当前时间时如何考虑夏令时?
【发布时间】:2011-10-29 22:32:25
【问题描述】:

当通过 PHP 脚本 (time()) 获取时间时,在夏令时期间,它似乎返回一小时的时间值。考虑到夏令时,有什么方法可以获得正确的时间?

【问题讨论】:

标签: php time dst


【解决方案1】:

time() 返回一个 Unix 时间戳,一个 Unix 时间戳是一个固定的时间段:自 Unix 纪元以来的秒数。不受时区影响。

一旦有了准确的时刻,您可能想要计算给定地点的当地时间:

<?php

$now = time();
echo $now . PHP_EOL;

date_default_timezone_set('Europe/Madrid');
echo date('r', $now) . PHP_EOL;

date_default_timezone_set('Asia/Tokyo');
echo date('r', $now) . PHP_EOL;

...将为相同的时间戳打印不同的本地日期:

1313683738
Thu, 18 Aug 2011 18:08:58 +0200
Fri, 19 Aug 2011 01:08:58 +0900

同样的推理也适用于相反的操作:

<?php

date_default_timezone_set('Europe/Madrid');
$then = mktime(23, 55, 30, 12, 31, 2000);
echo $then . PHP_EOL;

date_default_timezone_set('Asia/Tokyo');
$then = mktime(23, 55, 30, 12, 31, 2000);
echo $then . PHP_EOL;

... 将打印不同的时间戳:

978303330
978274530

【讨论】:

    【解决方案2】:

    time() 以 Unix Timestamp 格式获取操作系统时间。你可以用 PHP 纠正这个问题,但恕我直言,这应该是考虑在操作系统级别修复的问题。

    【讨论】:

      【解决方案3】:

      要么确保系统时间是最新的,要么在 PHP 中加/减:http://www.php.net/manual/en/function.date.php#69221

      【讨论】:

      • 我想补充一点,日期函数有一个特定的夏令时标志。
      【解决方案4】:

      使用date_default_timezone_set()设置正确的时区

      【讨论】:

      • 或者在PHP中通过php.ini设置时区
      【解决方案5】:

      这不是“最佳”答案,但您的提供商可能会错误地管理本地服务器时间。我不知道您使用时间信息的背景,但每当我使用此类信息时,我都会尝试使用 UTD/GMT。如果您的用户分布在世界各地,甚至是一个国家,那么纠正时间可能是一场噩梦。使用 UDT/GMT 可以合理地表示文件保存时间、日志时间或其他用途等内容。

      【讨论】:

      • 什么是 UTD/GMT 时间或 UDT/GMT 时间?也许您的意思是 UTC/GMT 时间还是别的什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 2013-09-18
      相关资源
      最近更新 更多