今天早上,我进行了单元测试,但失败了。 测试通过计算以下时间来获取过去48小时内的报价:
date('U', time() - 48 * 3600)
当我使用时:
(new DateTime('-48 hours'))->format('U')
显示一小时的差异。
可能是因为在波兰的星期天时间向后移动了一个小时
答案 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时间戳是固定的时间点(因此不会随时区切换)。