不同时区的DateDiff返回结果不同。

13

我在处理PHP DateDiff时遇到问题,不明白为什么每个时区返回不同的结果,比如在这个例子中,布拉格返回0个月,而美国返回1个月。

这种差异是什么原因,我该如何返回预期的一个月(而不是添加1个月后的30天)?

代码 Europe/Prague:

date_default_timezone_set("Europe/Prague");
$from = new \DateTimeImmutable('2016-09-01');
$to = $from->add(new \DateInterval('P1M'));
var_dump($from);
var_dump($to);
var_dump($from->diff($to)->m);
var_dump($from->diff($to)->d);

欧洲/布拉格的结果:

object(DateTimeImmutable)#1 (3) {
  ["date"]=>
  string(26) "2016-09-01 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Prague"
}
object(DateTimeImmutable)#3 (3) {
  ["date"]=>
  string(26) "2016-10-01 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Prague"
}
int(0)
int(30)

--

美国/太平洋时区的代码:

date_default_timezone_set("US/Pacific");
$from = new \DateTimeImmutable('2016-09-01');
$to = $from->add(new \DateInterval('P1M'));
var_dump($from);
var_dump($to);
var_dump($from->diff($to)->m);
var_dump($from->diff($to)->d);

结果为US/Pacific:

object(DateTimeImmutable)#2 (3) {
  ["date"]=>
  string(26) "2016-09-01 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(10) "US/Pacific"
}
object(DateTimeImmutable)#4 (3) {
  ["date"]=>
  string(26) "2016-10-01 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(10) "US/Pacific"
}
int(1)
int(0)

您介意也将小时、分钟、秒和毫秒一并 var_dump 吗? - Mchl
这可能是PHP本身的一个错误吗? - Michael Hirschler
@MichaelHirschler 可能吧,我不确定,这就是为什么我在 Stack Overflow 上发布了我的问题。 - patie
2个回答

2

PHP DateTime类确实存在一个小bug。 在计算后,您必须使用UTC时区并设置所需的时区:

date_default_timezone_set('UTC');

$europePrag = new DateTimeZone('Europe/Prague');
$usPacific = new DateTimeZone('US/Pacific');

$from = new \DateTimeImmutable('2016-11-01');
$to = $from->add(new \DateInterval('P1M'));
$from->setTimezone($europePrag);
var_dump($from);
var_dump($to);
var_dump($from->diff($to)->m);
var_dump($from->diff($to)->d);


$from = new \DateTimeImmutable('2016-11-01');
$to = $from->add(new \DateInterval('P1M'));
$from->setTimezone($usPacific);
var_dump($from);
var_dump($to);
var_dump($from->diff($to)->m);
var_dump($from->diff($to)->d);

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接