2017-10-18 105 views
0

我有存储在其中包含了在英国的时候设置一个事件的时间我的mysql数据库中的日期时间字段。在这个时间下面使用的例子是09:00。PHP setTimeZone时区转换问题 - 特殊性,由于BST(GMT + 1)

我试图在西海岸和东海岸的美国时区也显示此时间。

我相信我正确地使用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'); 

} 

我从小时的时差这将是假设有关英国观察夏令时 - 但我本来期望,因为我开始与“欧洲/伦敦DateTime对象这被分解

任何想法?

+0

你想要哪个时区? –

+0

@Hackit数据库将存储“欧洲/伦敦”时间的值。我期待在美国东海岸('America/New_York')和美国西海岸('America/Los_Angeles')转换并输出。 这是行得通 - 但是我的功能输出的时间在凌晨2点和凌晨5点不正确,他们应该是凌晨1点和凌晨4点。 – steve

+1

实际上,2017年10月30日,伦敦不在DST [(它在10月29日结束)](https://www.timeanddate.com/time/zone/uk/london?year=2017),而[New约克](https://www.timeanddate.com/time/zone/usa/new-york?year=2017)和[洛杉矶](https://www.timeanddate.com/time/zone/usa/los -angeles?year = 2017)都在夏令时(在十一月的两端)。因此,10月30日,伦敦上午9点相当于洛杉矶上午2点和纽约上午5点(由于所有DST规则):https://www.worldtimebuddy.com/?qm=1&lid=2643743, 5128581,5368361和H = 2643743&日期=二○一七年十月三十零日&SLN = 9-10 – 2017-10-18 16:19:26

回答

3

您已经选择的是发生在小窗口时,北美仍然是观察“夏令时间”的一个例子日期,但英国没有观测到“夏令时”:英国时钟改变的最后一个星期天到10月,但美国和加拿大时钟在11月的第一个星期日。

在此重叠本周,美国/纽约时间为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个小时是正确的。

有三月再过两个星期,其中北美改变其时钟较早,所以又会有一个4小时的偏移,而不是5

(同一门课程的适用于美洲/洛杉矶时区,在这三个星期内,这将是6个而不是7个小时)。