2017-10-18 101 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個小時)。