给你一个挠头。
我正在从IPInfoDB的 API 获取地理 IP 数据,它返回与 UTC 的时区偏移量,包括DST(如果当前已反映)。
例如,我住在 EST (-5),目前是 DST,所以地理 IP API 返回 ( -04:00
) 作为偏移量。
这太棒了,因为 DST 令人头疼。但令我惊讶的是,它引起了另一个头痛。
我在 PHP 中加载这些数据以通过 AJAX 传递给应用程序。我想在应用程序上获得 IP 地址的实时本地时间。
我已经完美地设置了这一切,但我疯狂地试图弄清楚如何设置 PHP 时区以匹配偏移量,这样我就可以抓住当前的小时date('H');
和分钟date('i');
来通过 AJAX 传递。
我不确定是否有一个特定的函数可以根据该偏移量给我当前的小时和分钟,或者是否有一种实用的方法可以根据偏移量设置时区(如果有效,则已经应用了 DST) .
我一直在搜索和搜索谷歌以找到答案,但我正在做的更具体,因为 DST 已经应用。
我在PHP.net上找到了一个似乎可以解决问题的函数(它适用于我的时区并返回正确的时间),尽管对于 PST 等其他时区,即使偏移量正确,它也会比应有的时间晚 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
。可能有一种方法可以在不需要开关/外壳的情况下也包含它。
注意:偏移量总是按原样返回+00:00
或-00:00
从地理 IP API 返回。
我将不胜感激任何帮助或正确方向的观点。我对 PHP 不是很熟悉,但偏移量对我来说是一个新故事。谢谢!