欧洲时间更改后的PHP日期

时间:2018-10-29 10:47:02

标签: php datetime

今天早上,我进行了单元测试,但失败了。 测试通过计算以下时间来获取过去48小时内的报价:

date('U', time() - 48 * 3600)

当我使用时:

(new DateTime('-48 hours'))->format('U')

显示一小时的差异。

可能是因为在波兰的星期天时间向后移动了一个小时

1 个答案:

答案 0 :(得分:1)

我假设您的服务器以Europe/Warsaw作为默认时区运行。如果PHP日期/时间计算跨越DST边界,则通常是不正确的,在这种情况下就是这样。我建议您使用UTC进行所有数学运算,并根据需要将时间转换为本地时间。

请比较:

$warsaw = new DateTimeZone('Europe/Warsaw');
$utc = new DateTimeZone('UTC');

$start = new DateTime('2018-10-28 04:30:00', $warsaw);
$start->modify('-4 hours');
var_dump($start);

$start = new DateTime('2018-10-28 04:30:00', $warsaw);
$start->setTimezone($utc);
$start->modify('-4 hours');
$start->setTimezone($warsaw);
var_dump($start);
object(DateTime)#3 (3) {
  ["date"]=>
  string(26) "2018-10-28 00:30:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Warsaw"
}
object(DateTime)#4 (3) {
  ["date"]=>
  string(26) "2018-10-28 01:30:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Warsaw"
}

代码的Unix时间戳版本应该不受影响,因为Unix时间戳是固定的时间点(因此不会随时区切换)。