【问题标题】:In PHP, how can I get Timezone from offset and country?在 PHP 中,如何从偏移量和国家/地区获取时区?
【发布时间】:2013-01-13 10:09:26
【问题描述】:

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

因此,例如,我有偏移量 -3 和国家巴西。

我想在同一偏移量(即 ART)中显示 BRT 而不是随机时区

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

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

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

谢谢!

【问题讨论】:

  • 您是否认为时区一直在变化,以使保持“最新”成为主要问题?
  • 取决于您对“主要关注点”的定义,但是是的,它们的变化频率足以让我担心。即使在美国,印第安纳州也在 2005 年改变了夏令时观测。

标签: php timezone


【解决方案1】:

无法从偏移量,甚至是偏移量加上国家/地区解析时区。请参阅the TimeZone tag wikiTimeZone != Offset 部分。偏移量在很多时间点都发生了变化,而且不可避免地会再次发生变化。

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

如果您可以向用户询问他们的时区,请这样做。这是最好的方法。我最喜欢的 UI 是基于 JavaScript 地图的时区选择器,such as this one。您可以使用jsTimeZoneDetect 做出最佳猜测默认选择。

【讨论】:

    【解决方案2】:

    您不必创建自己的数据库,这是来自GeoNames 的数据库。你也可以get all the timezone information from PHP

    【讨论】:

    • 酷,谢谢,这对我的目的来说已经足够了。我在研究答案时访问了这里,但不想使用他们的 API 并且之前没有看到可下载的数据。
    【解决方案3】:

    这个 PHP 函数返回一个包含所有现有时区的数组,包括偏移量,不完全是您正在寻找的,但它可能会有所帮助:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-12
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多