【问题标题】:Getting Windows Time in PHP在 PHP 中获取 Windows 时间
【发布时间】:2011-06-03 17:22:41
【问题描述】:

如何在 PHP 脚本中获取当前 Windows 时间?

使用time() 似乎不起作用,因为它可以识别时区并忽略服务器上是否实际打开了 DST。例如,如果时区设置为“America/Los_Angeles”但未选中 DST(Windows 机器),如果今天的日期是 9 月 1 日,则 Windows 时间可以是下午 1 点,但 PHP time() 将返回下午 2 点。

如何获取服务器的 Windows 时间? (使用 PHP 5.2.14)。

重现问题

  • 将时区设置为“America/Los_Angeles”并取消选中“夏令时”复选框。将日期设置为 2010 年 9 月 1 日下午 16:00:00。
  • 使用以下内容创建一个简单的 PHP 脚本,然后运行它

echo date_default_timezone_get(), date("H:i:s", time());

输出是 America/Los_Angeles 17:00:00。请注意 DST 造成的 1 小时差异。

【问题讨论】:

  • time() 返回时区中性的 UNIX 时间戳。你如何确定它关闭了一小时?
  • date_default_timezone_get() 说什么?你能显示一些代码吗?您如何确定 time() 已关闭?
  • date("r") 应该已经根据系统设置和时区为您提供本地时间,而 gmdate("r") 是 GMT 版本。否则可能是php.ini issue
  • @deceze、@Pekka、@mario:查看我的编辑。
  • @JRL 我认为问题在于 PHP 根本不听您本地的 DST 设置。它使用嵌入在时区信息中的官方 DST 信息,说明是否有 DST 以及在什么时间段。虽然不知道该怎么做

标签: php time dst


【解决方案1】:

我认为 PHP 没有考虑 Windows DST 设置。时区根据定义的标准进行解释。同样根据上次出现的情况:Daylight savings time not correct even after setting timezone

但是请看http://php.net/manual/en/function.date-default-timezone-set.php
有一些示例代码使用 WShell 来查询 Win 注册表的实际值,包括 DST 标志。然后使用timezone_abbreviations_list(),您可以找到具有正确时区名称和 DST 标志的别名,然后设置它。

@Pekka 在这里还有另一个手动解决方法:php date() one hour ahead of server time (DST problem)(他只是没有告诉所有人。)

【讨论】:

    【解决方案2】:

    date("Z") 以秒为单位为您提供与 gmt 的签名本地偏移量。然后您可以将其添加到日期的输出中。请参阅date function 的手册页

    如果您不信任该设置,您也可以使用shell_exec 执行日期命令并解析输出

    【讨论】:

    • date("Z") 给出了时区偏移量,这不是我需要的,因为它没有考虑服务器上是否启用了 DST。
    • 至于解析 shell_exec 的输出,问题是语言环境可能不同,因此它的匹配器可能很复杂。
    猜你喜欢
    • 2017-11-03
    • 2012-01-29
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2010-09-18
    • 2012-09-26
    • 2017-09-06
    相关资源
    最近更新 更多