【问题标题】:php: DateTime() and time() have different timephp: DateTime() 和 time() 有不同的时间
【发布时间】:2018-03-25 21:37:09
【问题描述】:

我正在使用时区设置为 Europe/Brussels 的 Vagrant box (Homestead)。

我使用命令“date”进入终端的当前时间,返回这个值:

2018 年 3 月 25 日星期日 23:27:40 CEST

在 cli 和 fpm php.ini 文件中我都有:

date.timezone = "欧洲/布鲁塞尔"

同时运行以下代码: print_r(新日期时间()); print_r(time());

给出以下结果: 对于日期时间():

[
  "date" => "2018-03-25 23:27:43.650908",
  "timezone_type" => 3,
  "timezone" => "Europe/Brussels"
]

以及 time() 的纪元时间戳

1522013263

转换后者给出:

Sun, 25 Mar 2018 21:27:43 GMT

鉴于 DateTime 的结果,我可以假设 php.ini 中的时区设置是正确的。但是那为什么 DateTime 和 time 之间的时间不一样呢?

【问题讨论】:

    标签: php linux ubuntu vagrant homestead


    【解决方案1】:

    我自己对 PHP 不是很有经验,但是对于 time(),我看到的是 GMT。 GMT 是您使用的时区,还是 UTC(或其他)?它们可能是完全分开的。

    If i am incorrect, try reading here

    或了解更多高级信息,Try here.

    【讨论】:

      【解决方案2】:

      time() 返回 Unix 时间戳,并且始终为 GMT:

      返回以秒数为单位测量的当前时间 Unix 纪元(1970 年 1 月 1 日 00:00:00 GMT)。

      21:27:43 GMT 等于23:27:43 CEST

      如 cmets 中所述:实际上 unix 时间戳是 UTC,但 PHP does not seem to make much of a difference。不幸的是,文档在这方面并不是很有启发性。

      【讨论】:

      • 严格来说,Unix 时钟与 UTC 而非 GMT 对齐,尽管差异很小,对于大多数用途而言无关紧要。
      • 那么我应该使用什么来设置cookie的过期时间? DateTime 并将其转换为时间戳或 time()?真的很混乱。
      • 如果您使用的是setcookie,那么此函数需要time() 返回的Unix 时间戳。
      • @Marvin,我知道 setcookie 需要 Unix 时间戳。但是使用 time() 函数获取时间戳给了我错误的时间。即它给了时间-2小时。因此,如果我将 cookie 过期时间设置为 3600,那么 cookie 将已经过期 2 小时。这意味着我应该获取用户的浏览器时区并相应地设置cookie时间?
      • 它确实不会给你错误的时间 - 只是同一时间点在不同的时区。并且RFC 6265 还需要 GMT/UTC(参见 5.1.1),RFC 2616 甚至需要它(参见 3.3.1;明确声明 GMT 和 UTC 就 HTTP 而言是相等的)。
      猜你喜欢
      • 2012-10-31
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多