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

标签 php geolocation timezone timezone-offset

一个给你的挠头。

我正在从 IPInfoDB 获取地理 IP 数据的 API,它返回与 UTC 包括 DST(如果当前反射(reflect))的时区偏移量。

例如,我住在美国东部时间 (-5),目前是夏令时,因此地理 IP API 返回 (-04:00) 作为偏移量。

这太棒了,因为 DST 令人头疼。但令我惊讶的是,它引起了另一个头痛。

我在 PHP 中加载此数据以通过 AJAX 传递给应用程序。我想在应用程序上获得 IP 地址的实时本地时间。

我已经完美地设置了所有这些,但我正在疯狂地尝试弄清楚如何设置 PHP 时区以匹配偏移量,这样我就可以获取当前时间 date('H'); 和分钟 date('i'); 通过 AJAX 传递给。

我不确定是否有一个特定的函数可以根据该偏移量给我当前的小时和分钟数,或者是否有一种实用的方法可以根据偏移量设置时区(如果是,则已经应用了夏令时)有效)。

我一直在 Google 上搜索和搜索以找到这个问题的答案,但我所做的更加具体,因为夏令时已经应用。

我在 PHP.net 上找到了一个函数这似乎可以解决问题(它适用于我的时区并返回正确的时间)尽管对于 PST 等其他时区,即使偏移量正确(-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。可能有一种方法可以在不需要 switch/case 的情况下包含它。

注意偏移量始终从地理 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('', $seconds, 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.

引用资料:

关于php - 将 UTC 偏移量转换为时区或日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11820718/

相关文章:

geolocation - 如何正确对 GSM 蜂窝塔进行三角测量以获得位置?

mysql - Codeigniter 时区 mysql 设置

javascript - 根据输入的日期获取所有 javascript 时区

java - 在 java 中使用 new Date() 获取时间的奇怪行为

php - 知道图片上传网站如何保存图片吗?

iphone - 地理定位二维码格式

php - 从 Git 存储库安装时覆盖 PHPUnit 输出中的 "@package_version@"

geolocation - 无法在 liferay porlets 上获取远程 IP 和位置

php - PHP echo 遇到一些问题

php - php 站点是否仅使用 mysql SELECT 免受 sql 注入(inject)攻击