我正在从IPInfoDB的API获取地理IP数据,并返回与UTC的时区偏移量,包括DST(如果当前反映).
例如,我住在EST(-5),目前是DST,所以geo IP API返回(-04:00)作为偏移量.
这是美好的,因为DST是一个令人头痛的头痛.但令我惊讶的是,这又引起了头痛.
我将PHP中的数据加载到AJAX应用程序中.我想在应用程序上拥有当地IP地址的当地时间.
我已经完成了所有设置,但是我会疯狂地试图找出如何设置PHP时区来匹配偏移量,所以我可以抓住当前的小时日期(‘H’);和分钟日期(‘i’);通过AJAX传递.
我不确定是否有一个特定的功能,可以根据该偏移给我当前的时间和分钟,或者如果有一个实际的方式来设置基于偏移的时区(如果有效,它将具有应用的DST) .
我一直在搜索和搜索Google,以找到一个答案,但是我正在做的是更具体的,因为DST已被应用.
我在PHP.net上发现了一个功能,似乎在做这个伎俩(它适用于我的时区并返回正确的时间),但是对于其他时区(如PST),它返回1小时后,即使偏移量正确(-07 :00与DST).
该功能返回的时区是智利/ 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',':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的新手,但是补偿是我的一个新故事.谢谢!
<?PHP $offset = '-7:00'; // Calculate seconds from offset list($hours,$minutes) = explode(':',$offset); $seconds = $hours * 60 * 60 + $minutes * 60; // Get timezone name from seconds $tz = timezone_name_from_abbr('',$seconds,1); // Workaround for bug #44780 if($tz === false) $tz = timezone_name_from_abbr('',0); // Set timezone date_default_timezone_set($tz); echo $tz . ': ' . date('r');
timezone_name_from_abbr的第三个参数控制是否调整夏令时.
timezone_name_from_abbr() will return false on some time zone
offsets. In particular – Hawaii,which has a -10 from GMT offset,-36000
seconds.
参考文献:
> @L_502_4@
> date_default_timezone_set
> date