将 UTC 偏移量转换为时区或日期
给你一个挠头。
我正在从IPInfoDB的API中获取地理IP数据,它返回UTC的时区偏移量,包括DST(如果当前反映)。
例如,我住在 EST (-5), 目前是 DST,因此 geo IP API 返回 () 作为偏移量。-04:00
这真是太好了,因为DST是一个令人毛骨悚然的头痛。但令我惊讶的是,这又引起了另一个头痛。
我在PHP中加载此数据,通过AJAX传递到应用程序。我想在应用程序上有IP地址的实时本地时间。
我已经完美地设置了这一切,但是我正在疯狂地试图弄清楚如何设置PHP时区以匹配偏移量,以便我可以抓住当前的小时和分钟通过AJAX传递到。date('H');
date('i');
我不确定是否有特定的函数可以根据该偏移量为我提供当前小时和分钟,或者是否有一种实用的方法来根据偏移量设置时区(如果生效,则已经应用了DST)。
我一直在搜索和搜索Google以找到答案,但是由于DST已经应用,因此我正在做的事情更加具体。
我在 PHP.net 上发现了一个似乎可以解决问题的函数(它适用于我的时区并返回正确的时间),尽管对于其他时区(如PST),即使偏移量是正确的(使用DST),它也比它应该返回的时间晚1小时。-07:00
从函数返回的时区是我有感觉是原因的。如果可以的话,我会让它只适用于美国,但我确实需要它在全球范围内。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
注意:偏移量始终按此方式返回,或从 geo IP API 返回。+00:00
-00:00
我将不胜感激任何帮助或朝着正确方向指出的一点。我对PHP不是很新手,但偏移量对我来说是一个新故事。谢谢!