欧洲时间变化后的PHP日期
今天早上,我运行了单元测试,结果失败了。 通过计算以下时间,测试从过去48小时开始接受报价:欧洲时间变化后的PHP日期,php,datetime,Php,Datetime,今天早上,我运行了单元测试,结果失败了。 通过计算以下时间,测试从过去48小时开始接受报价: date('U', time() - 48 * 3600) 当我使用: (new DateTime('-48 hours'))->format('U') 它显示了一个小时的差异 原因可能是波兰周日的时间向后移动了一小时我想您的服务器运行的默认时区是欧洲/华沙。PHP日期/时间计算如果跨越DST边界,通常是不正确的,这里就是这样。我建议您使用UTC进行所有数学运算,并根据需要转换为当地时间 请比
date('U', time() - 48 * 3600)
当我使用:
(new DateTime('-48 hours'))->format('U')
它显示了一个小时的差异
原因可能是波兰周日的时间向后移动了一小时我想您的服务器运行的默认时区是欧洲/华沙。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);
Unix时间戳版本的代码应该不受影响,因为Unix时间戳是一个固定的时间点,因此不会随时区切换。很可能!为避免此类问题,请使用Epoch unix时间戳,并且仅转换为读取。在处理采用夏令时的时区时,使用乘法可能会暴露问题。
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"
}