PHP时区选择

Posted

技术标签:

【中文标题】PHP时区选择【英文标题】:PHP timezone select 【发布时间】:2013-06-11 20:26:17 【问题描述】:

我一直在做一些研究,为用户提供一个可用的时区选择框,但到目前为止我对结果并不满意。 我正在使用 php 的内置 DateTime 和 DateTimeZone 来获取时区列表(Olson 数据库)。但是,如果您曾经使用过它,您就会知道它是一个很长的列表(大约 300 项),因此在选择框中无法使用。我使用 optgroups 对其进行了一些格式化,以按区域对其进行分组,并将具有相同 UTC 偏移量的城市连接起来。清单仍然很长,我对此并不满意。如果有意义的话,我实际上只想获取世界每个地区的主要城市,而不是相对不为人知的城市。

我想保持标识符不变,因为我可以使用带有 DateTime 和 DateTimeZone 类的标识符来执行转换和其他操作。有关如何使此列表更有用/更短的任何想法?

我现在的代码如下(现在有点乱,但正在进行中):

    public function getListOfTimezones()
    
        $options = array();
        $utc = new DateTimeZone('UTC');

        //$regions = array('Africa', 'America', 'Antarctica', 'Arctic', 'Asia', 'Atlantic', 'Australia', 'Europe', 'Indian', 'Pacific');
        $regions = array('America', 'Asia', 'Atlantic', 'Australia', 'Europe', 'Pacific');
        $tzs = DateTimeZone::listIdentifiers();
        $optgroup = null;
        $timezoneGroup = array();
        sort($tzs);

        foreach ($tzs as $tz)
        
            $timezonepieces = explode('/', $tz, 2);

            if (count($timezonepieces) != 2 || !in_array($timezonepieces[0], $regions)) continue;

            $region = $timezonepieces[0];
            $location = $timezonepieces[1];             

            if (count($timezoneGroup) > 0)
            
                $lastTimeZone = $timezoneGroup[count($timezoneGroup) - 1];

                $utcTime = new DateTime(null, $utc);
                $timezoneInfo = new DateTimeZone($tz);
                $lastTimeZoneInfo = new DateTimeZone($lastTimeZone['timezoneid']);

                if ($timezoneInfo->getOffset($utcTime) == $lastTimeZoneInfo->getOffset($utcTime))
                
                    $addTz = array('timezoneid' => $tz, 'timezonelabel' => str_replace('_', ' ', $location));
                    $timezoneGroup[] = $addTz;
                
                else
                
                    $labels = array();

                    if (count($timezoneGroup) > 5)
                    
                        $timezoneGroup = array_slice($timezoneGroup, 0, 5);
                    

                    $country = '';
                    foreach ($timezoneGroup as $curTimezone)
                    
                        $pieces = explode('/', $curTimezone['timezonelabel'], 2);

                        if (count($pieces) == 2)
                        
                            if ($pieces[0] == $country)
                            
                                continue;
                            
                            else
                            
                                $country = $pieces[0];
                               
                        

                        $labels[] = $curTimezone['timezonelabel'];
                    
                    $optgroup['options'][htmlentities($timezoneGroup[0]['timezoneid'])] = implode(', ', $labels);

                    // New timezone group
                    $timezoneGroup = array();
                    $addTz = array('timezoneid' => $tz, 'timezonelabel' => str_replace('_', ' ', $location));
                    $timezoneGroup[] = $addTz;
                
            
            else
            
                $addTz = array('timezoneid' => $tz, 'timezonelabel' => str_replace('_', ' ', $location));
                $timezoneGroup[] = $addTz;
            

            if (!$optgroup || (is_array($optgroup) && array_key_exists('label', $optgroup) && $optgroup['label'] != htmlentities($region)))
            
                if ($optgroup)
                
                    // End of previous optgroup, start of new one
                    $options[] = $optgroup;
                

                $optgroup = array('label' => htmlentities($region), 'options' => array());
            
        

        if (is_array($optgroup))
        
            $options[] = $optgroup;
        

        return $options;
    

【问题讨论】:

用JS实现边打字边找?例如,Select2 这是一个相当不错的组件。我会调查一下,看看我能不能把它扔进去。谢谢! 好的,我实现了 Select2 选择框,这样对于普通用户来说非常容易使用。非常感谢乔恩。由于您使用评论回答,我无法给您积分。如果您将其写在答案中,我将接受它作为答案。 我已经添加了答案,谢谢。 您是否考虑过基于地图的时区选择器?它们往往对用户更友好。 Here is one I like。那里还有其他人。 【参考方案1】:

当需要像这里这样的专门数据输入时,使用纯 HTML 可以做的事情是有限的。

我推荐使用一些增强时区选择的 javascript 组件;例如,我也使用的一个非常好的 jQuery 插件是Select2。它可以在您键入时自动查找下拉菜单以及许多附加功能。

【讨论】:

以上是关于PHP时区选择的主要内容,如果未能解决你的问题,请参考以下文章

PHP CakePHP时区选择查看帮助程序

PHP、MySQL 和时区

mysql选择CURDATE()按新时区中的class

[转]PHP时区/MySql时区/Linux时区

Php:根据用户更改时区[重复]

在php中获取用户当前时区[重复]