您的頭部劃痕。將UTC偏移量轉換爲時區或日期
我從IPInfoDB的API獲取地理IP數據,它返回UTC 的時區偏移量,包括 DST(如果當前已反映)。
例如,我住在EST(-5),目前是DST,所以地理IP API返回(-04:00
)作爲偏移量。
這真是太棒了,因爲DST是一個令人頭痛的頭痛。但令我驚訝的是,這引起了另一場頭痛。
我將這些數據加載到PHP中,通過AJAX傳遞給應用程序。我希望在應用程序中擁有本地IP地址的實時時間。
我已經完全設置好了,但我瘋了,試圖找出如何設置PHP時區匹配偏移量,所以我可以抓住當前小時date('H');
和分鐘date('i');
傳遞給通過AJAX。
我不確定是否有一個特定的函數可以根據該偏移量給出當前的小時數和分鐘數,或者是否存在一種基於偏移量設置時區的實際方法(如果使用了DST,將會應用if有效)。
我一直在搜索和搜索谷歌找到答案,但我做的更具體,因爲已經應用了DST。
我在PHP.net上發現了一個函數,它似乎可以做到這一點(它適用於我的時區並返回正確的時間),但對於其他時區(例如PST),即使偏移量爲1小時,正確(-07:00
與DST)。
從函數返回的時區是Chile/EasterIsland
,我有一種感覺是原因。如果可以的話,我會讓這隻適用於美國,但我確實需要它在全球範圍內。
這是我現在的功能。請原諒非常混亂的代碼。在過去的幾個小時裏,我一直在玩弄很多東西,試圖找出解決方案。
大部分功能都在網上找到。
function offsetToTZ($offset) {
switch((string) $offset) {
case '-04:30' : return 'America/Caracas'; break;
case '-03:30' : return 'Canada/Newfoundland'; break;
case '+03:30' : return 'Asia/Tehran'; break;
case '+04:30' : return 'Asia/Kabul'; break;
case '+05:30' : return 'Asia/Kolkata'; break;
case '+05:45' : return 'Asia/Kathmandu'; break;
case '+09:30' : return 'Australia/Darwin'; break;
}
$offset = (int) str_replace(array('0',0,':00',00,'30',30,'45',45,':','+'),'', (string) $offset);
$offset = $offset*60*60;
$abbrarray = timezone_abbreviations_list();
foreach ($abbrarray as $abbr) {
foreach($abbr as $city) {
if($city['offset'] == $offset) {
return $city['timezone_id'];
}
}
}
return false;
}
我包括用於某些時區是:30
和:45
那裏的開關/箱。可能還有一種方法可以將這種情況也包括在內,而不需要開關/外殼。
注意:偏移總是從地理IP API返回+00:00
或-00:00
。
我會感謝任何幫助或在正確的方向點。我並不是PHP新手,但補償對我來說是一個新故事。謝謝!
這是我一直在尋找的東西。似乎它會工作得很好,但我需要花一些時間並測試它。無論哪種方式,您都是我所追求的最接近解決方案的人。我感謝您的幫助,並且您有幸獲得了賞金:) – 2012-08-11 23:02:54
請注意,有一個錯誤:https://bugs.php.net/bug.php?id=44780 – 2012-10-07 10:16:28
@HonzaJavorek有趣的是,我認爲這是因爲某些地點不適合夏令時。不過,我想我已經找到了解決方案。 – 2012-10-07 20:08:55