在PHP中,如何从偏移量和国家/地区获取时区?

时间:2013-01-29 18:26:13

标签: php timezone

我正在进行IP查找以确定与UTC和国家/地区信息的时区偏移的“最佳猜测”。

所以,例如,我有偏移-3和国家巴西。

我想在相同的偏移中显示BRT而不是随机时区,即ART

PHP中是否有一些内置方法可以使用此信息设置适当的时区?

如果没有,最简单的方法是什么? (假设我无法进行任何外部API调用)

如果我自己创建数据库表,我该如何确保它保持最新?

谢谢!

3 个答案:

答案 0 :(得分:2)

无法从偏移量,甚至偏移量加上国家/地区解析时区。请参阅the TimeZone tag wikiTimeZone != Offset部分。抵消在许多时间点发生了变化,它们将不可避免地再次发生变化。

您需要更多信息,例如纬度/经度。请参阅this community wiki

如果您可以询问用户的时区,请执行此操作。这是最好的方式。我最喜欢的UI是基于JavaScript地图的时区选择器such as this one。您可以使用jsTimeZoneDetect制作最佳猜测默认选项。

答案 1 :(得分:1)

这个PHP函数返回一个包含Offset的所有现有时区的数组,不完全是你想要的但可能有帮助:

function time_zonelist(){
    $return = array();
    $timezone_identifiers_list = timezone_identifiers_list();
    foreach($timezone_identifiers_list as $timezone_identifier){
        $date_time_zone = new DateTimeZone($timezone_identifier);
        $date_time = new DateTime('now', $date_time_zone);
        $hours = floor($date_time_zone->getOffset($date_time) / 3600);
        $mins = floor(($date_time_zone->getOffset($date_time) - ($hours*3600)) / 60);
        $hours = 'GMT' . ($hours < 0 ? $hours : '+'.$hours);
        $mins = ($mins > 0 ? $mins : '0'.$mins);
        $text = str_replace("_"," ",$timezone_identifier);
        $return[$timezone_identifier] = $text.' ('.$hours.':'.$mins.')';
    }
    return $return;
}

答案 2 :(得分:0)

您不必滚动自己的数据库,这里是GeoNames的数据库。您还可以get all the timezone information from PHP