【问题标题】:PHP DateTime Diff DSTPHP 日期时间差异 DST
【发布时间】:2016-05-12 22:31:37
【问题描述】:

我的问题在于这段代码

$d1 = new DateTime('2016-02-29', new DateTimeZone('UTC'));
$d2 = new DateTime('1998-03-01', new DateTimeZone('UTC'));
echo $d1->diff($d2)->y;

你能在你的机器上执行这个命令吗?

php -r "\$d1 = new DateTime('2016-02-29', new DateTimeZone('UTC'));\$d2 = new DateTime('1998-03-01', new DateTimeZone('UTC')); echo \$d1->diff(\$d2)->y;"

这会在我的机器中返回18,但它已经过去了 17 年,而不是 18 年。

我不明白为什么,在这个 php 在线解释器中 http://sandbox.onlinephpfunctions.com/code/50cc70c56695f08c62047fb7841aae9fec4c2ec6

上面写着17

我的 php.ini 有

php -i | grep timezone
Default timezone => Europe/Madrid
date.timezone => Europe/Madrid => Europe/Madrid

但如果我改为“UTC”,它会一直失败并说 18 年。

也没有关系,因为我在代码中将时区设置为 UTC 以避免 DST。

这是怎么回事?!

编辑:

php -r "\$d1 = new DateTime('2016-02-29T00:00:00Z');\$d2 = new DateTime('1998-03-01T00:00:00Z'); echo \$d1->diff(\$d2)->y;"

这给了我17

似乎 DateTime 认为输入来自非 UTC 时区,并且从那里做了一些奇怪的内部工作。

【问题讨论】:

  • 在任何版本上都没有复制 3v4l.org/KGOFg
  • 我使用当前版本的 PHP 5.3、5.4、5.5、5.6 和 7.0 运行它。他们都显示17。 OSX El Capitan 上的自制 PHP。
  • 啊哈,所以,我的意思是,这是使用 datetime 的 PHP 错误(如果 2 月有 29 天)。例如:请区分 1998-03-01 到 2015-02-29 和 2016-02-29。第一次和第二次将返回 17 年:D
  • 3v4l.org/BXLlk为什么为什么为什么

标签: php datetime dst


【解决方案1】:

两个日期代表相同的 - 一年中的第 59 天:

$ php -a
Interactive mode enabled

php > var_dump(DateTime::createFromFormat('d.m.Y', '01.03.1998')->format('z'));
string(2) "59"
php > var_dump(DateTime::createFromFormat('d.m.Y', '29.02.2016')->format('z'));
string(2) "59"

并不是说你错了,但是说从 1998 年的第 59 天到 2016 年的第 59 天已经过去了 18 年也是完全正确的。

如果我不得不猜测的话,PHP 在这个特定场景中正是以这种方式计算差异的,这显然是一种极端情况,所以我们只需要接受这个悖论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多