PHP setTimeZone时区转换问题 - 由BST(GMT + 1)引起的特性

时间:2017-10-18 16:09:59

标签: php mysql datetime

我的mysql数据库中存储了一个日期时间字段,其中包含在英国时间设置事件的时间。在下面使用的示例中,这个时间是09:00。

我也试图在西海岸和美国东海岸的时区展示这段时间。

我相信我正在使用php DateTime' setTimeZone'功能正常 - 但两个时区的结果都是一小时

$online->getTimeByZone('America/Los_Angeles'); // Returns 02:00
$online->getTimeByZone('America/New_York'); // Returns 05:00


public function getTimeByZone($timezone = 'Europe/London') {

   $date = $this->getDateField('start_time', 'Y-m-d H:i:s'); // 2017-10-30 09:00:00 

   $datetime = new DateTime($date, new DateTimeZone('Europe/London'));
   $datetime->setTimeZone(new dateTimeZone($timezone));

   return $datetime->format('H:i');

}

我假设从小时差异来看,这将与英国观察夏令时有关 - 但我原本预料到我会用欧洲/伦敦'欧洲/伦敦'这是要考虑的因素。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

当北美仍在观察“夏令时”时,您选择了小窗口中的示例日期,但英国没有观察到“夏令时”:英国时钟在10月的最后一个星期日发生变化,但是美国11月的第一个星期天加拿大钟表。

在此重叠周期间,America / New_York时间为UTC-4(“东部夏令时”),欧洲/伦敦时间为UTC + 0(“格林威治标准时间”)。因此,“2017-10-30 09:00:00欧洲/伦敦”确实是“2017-10-30 05:00:00 America / New_York”。

如果您提前一周选择日期,则抵消将为UTC-4和UTC + 1(“英国夏令时”);一周后,它们将是UTC-5(“东部标准时间”)和UTC + 0;因此,在一年中的大部分时间里,你认为预期的差异是5小时是正确的。

3月还有两个星期,北美更早地改变它的时钟,所以再次有4小时的偏移,而不是5。

(当然同样适用于America / Los_Angeles时区,在这三个星期内,这个时区将是6而不是7小时。)