微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 将UTC偏移量转换为时区或日期

一个头刮手为你.

我正在从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的新手,但是补偿是我的一个新故事.谢谢!

可以通过将偏移量转换为几秒钟并将其传递给timezone_name_from_abbr:
<?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');

Demo

timezone_name_from_abbr的第三个参数控制是否调整夏令时.

Bug #44780

timezone_name_from_abbr() will return false on some time zone
offsets. In particular – Hawaii,which has a -10 from GMT offset,-36000
seconds.

参考文献:

> timezone_name_from_abbr
> date_default_timezone_set
> date

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐