【发布时间】:2012-08-02 23:27:50
【问题描述】:
给你一个头疼的东西。
我正在从IPInfoDB 的 API 获取地理 IP 数据,它返回与 UTC包括 DST 的时区偏移量(如果当前反映)。
例如,我住在 EST (-5),目前是 DST,因此地理 IP API 返回 (-04:00) 作为偏移量。
这太棒了,因为 DST 令人头疼。但令我惊讶的是,它引起了另一个头痛。
我在 PHP 中加载这些数据以通过 AJAX 传递给应用程序。我想在应用程序上获得 IP 地址的实时本地时间。
我已经完美地设置了这一切,但我疯狂地试图弄清楚如何设置 PHP 时区以匹配偏移量,这样我就可以获取当前小时 date('H'); 和分钟 date('i'); 以通过 AJAX 传递.
我不确定是否有一个特定的函数可以根据该偏移量给我当前的小时和分钟,或者是否有一种实用的方法可以根据偏移量设置时区(如果是,则已经应用了 DST有效)。
我一直在搜索和搜索 Google 以找到答案,但我正在做的更具体,因为 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 的开关/案例。可能有一种方法可以在不需要 switch/case 的情况下包含它。
注意: 偏移量总是从 geo IP API 返回 +00:00 或 -00:00。
我将不胜感激任何帮助或正确方向的观点。我对 PHP 不是很熟悉,但偏移量对我来说是一个新故事。谢谢!
【问题讨论】:
标签: php geolocation timezone timezone-offset