【发布时间】: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为什么为什么为什么