Codeigniter, timezone_menu и date_default_timezone_set - PullRequest
7 голосов
/ 06 марта 2011

Я использую Codeigniters timezone_menu, который дает выпадающий список часовых поясов, и мне интересно, как мы должны использовать эти часовые пояса с PHP date_default_timezone_set?

Пример часового пояса codeigniters: UP1.Тем не менее, вы не можете использовать это с PHP date_default_timezone_set, так как строка, которую она принимает, должна выглядеть примерно так: Europe/Berlin

Вопрос в том, есть ли способ преобразовать строку часового пояса codeigniterPHP, который может быть принят date_default_timezone_set?

Ответы [ 4 ]

7 голосов
/ 28 марта 2011

У меня работает следующее:

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

EDIT Оригинальная функция не исключала смещения DST. timezone_abbreviations_list () перечисляет 2x для часового пояса, для которого DST помечен как true, например, Тасмания отображается под +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
2 голосов
/ 28 марта 2011

Вы можете получить смещение UTC для одного из U(M|P)x -значений, используя timezones().

$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/Berlin, Europe/Brussels, Europe/Copenhagen, Europe/Madrid, Europe/Paris , Europe/Rome но также Africa/Luanda например. В настоящее время все становится произвольно сложным из-за DST-переходов, которые могут быть недоступны в некоторых из этих часовых поясов.

Если вам не нужна вещь DST, сопоставление между возвращаемым значением функции timezones() и часовыми поясами Etc/GMT(+|-)x должно быть в порядке, в противном случае вы вообще не можете использовать обработку часового пояса Codeigniter, поскольку отображение не однозначный.

0 голосов
/ 23 декабря 2011

Вы можете использовать значение смещения часового пояса в функции 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
0 голосов
/ 31 марта 2011

Codeigniter возвращает ссылку на часовой пояс, которую можно использовать с часовыми поясами (), чтобы получить разницу во времени, и из их можно вычислить время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...