Codeigniter,timezone_menu和date_default_timezone_set

时间:2011-03-06 18:49:03

标签: php codeigniter timezone

我使用了Codeigniters timezone_menu,它提供了drop down box个时区,我想知道我们应该如何在PHP date_default_timezone_set中使用这些时区?

codeigniters时区的一个例子是UP1。但是,您不能将它与PHP date_default_timezone_set一起使用,因为它所采用的字符串应该类似于Europe/Berlin

问题是,有没有办法将codeigniter时区字符串转换为date_default_timezone_set可以接受的PHP格式?

4 个答案:

答案 0 :(得分:7)

以下适用于我:

// Example - timezones is part of the date helper function
// You obviously wouldn't echo it out, you would pass it in to 
// set default timezone function in PHP based on the posted data from 
// the dropdown
echo timezone_by_offset(timezones('UM5')); // ouputs 'America/Porto_Acre' which is (-5)

// And the function
function timezone_by_offset($offset) {
    $offset = ($offset+1) * 60 * 60;
    $abbrarray = timezone_abbreviations_list();

    foreach ($abbrarray as $abbr) {
        foreach ($abbr as $city) {
            if ($city['offset'] == $offset) { 
                echo($city['timezone_id']);
                return true;
            }
        }
    }
    echo "UTC";
    return false;
} 

修改 原始功能不排除DST偏移。 timezone_abbreviations_list()为DST标记为true的时区列出2x,例如Tasmania出现在+11和+10之下。因此,如果DST == TRUE,则将其忽略为返回列表的一部分。

//-- Function -------------------------------------------------------------------
function timezone_by_offset($offset) {
    $abbrarray = timezone_abbreviations_list();
    $offset = $offset * 60 * 60;

    foreach ($abbrarray as $abbr) {
        foreach ($abbr as $city) {
            if ($city['offset'] == $offset && $city['dst'] == FALSE) { 
                return $city['timezone_id'];                                
            }
        }
    }
    return 'UTC'; // any default value you wish
}

一些例子:

//-- Test Cases -------------------------------------------------------------------
echo timezone_by_offset(-12) . '<br/>';  
echo (date_default_timezone_set(timezone_by_offset(-12)) == TRUE ? 'Valid' : 'Not Valid'). '<br/>'; 
// Etc/GMT+12
// Valid 

echo timezone_by_offset(-10) . '<br/>';  
echo (date_default_timezone_set(timezone_by_offset(-10)) == TRUE ? 'Valid' : 'Not Valid'). '<br/>'; 
// America/Anchorage
// Valid

echo timezone_by_offset(-8) . '<br/>';  
echo (date_default_timezone_set(timezone_by_offset(-8)) == TRUE ? 'Valid' : 'Not Valid'). '<br/>'; 
// Etc/GMT+8
// Valid        

echo timezone_by_offset(6) . '<br/>';  
echo (date_default_timezone_set(timezone_by_offset(6)) == TRUE ? 'Valid' : 'Not Valid'). '<br/>'; 
// Asia/Aqtobe
// Valid        

echo timezone_by_offset(7) . '<br/>';  
echo (date_default_timezone_set(timezone_by_offset(7)) == TRUE ? 'Valid' : 'Not Valid'). '<br/>'; 
// Indian/Christmas
// Valid

答案 1 :(得分:2)

您可以使用U(M|P)x获取其中一个timezones() - 值的UTC偏移量。

$offset = timezones('UP1'); // don't know the exact format returned but should be something like 1 or '+01:00'

从这一点开始,我认为唯一的方法是在偏移量和PHP时区之间进行某种自定义映射。您可以使用Etc/GMT(+|-)x时区,但问题在于它们不包含任何DST转换信息。

一般的问题是,UTC偏移实际上映射到许多不同的时区,例如UP1(UTC + 1:00)柏林,布鲁塞尔,哥本哈根,马德里,巴黎,罗马)映射到Europe/BerlinEurope/Brussels,{{1} },Europe/CopenhagenEurope/MadridEurope/Paris,但也适用于Europe/Rome。由于DST过渡可能在某些时区中可能不会发生,因此事情现在变得任意复杂。

如果您不需要DST-thing,Africa/Luanda函数的返回值与timezones()时区之间的映射应该没问题,否则您根本无法使用Codeigniter时区处理因为映射不是明确的。

答案 2 :(得分:0)

Codeigniter返回时区参考,可以与timezones()一起使用以获得时间差异,从中可以计算时间。

答案 3 :(得分:0)

您可以在gmt_to_local()函数中使用时区偏移量的值,例如:

//set the time offset based on the users timezone settings
$timezone = 'UM7';

$offset = timezones($timezone);
$servertime = time();

$mytime = gmt_to_local($servertime,$offset);

$time = date("M d, Y h:i A", $mytime);

//example result
//Dec 22, 2011 04:18 PM