Intereting Posts
MySQL: mysql_fetch_assoc (): предоставленный аргумент не является допустимым ресурсом результата MySQL PHP, как обрезать массив Удалите PHP полностью из Ubuntu spl_object_hash () ожидает, что параметр 1 будет объектом, null Многопользовательский поисковый запрос PHP MySQL с использованием опции / выбора тегов HTML-формы Загрузка изображения на facebook Каковы аргументы в FAVOR PHP закрытия тегов для файлов только PHP? Оператор mysqli execute (), правильный путь Объединение групп узлов XML как обрабатывать большой размер запроса на обновление в mysql с laravel PHP. Является ли htmlentities () достаточным для создания xml-безопасных значений? Как рассчитать разницу между двумя днями как форматированную строку? используя mod_rewrite от apache для анализа SEO-URL-адресов как передать все параметры запроса запроса на встроенные контроллеры в twig symfony 2? организовать отображение данных из таблицы

Codeigniter, timezone_menu и date_default_timezone_set

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

Примером часового пояса UP1 является UP1 . Однако вы не можете использовать это с PHPs date_default_timezone_set поскольку строка, в которой она требуется, должна быть чем-то вроде Europe/Berlin

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

Solutions Collecting From Web of "Codeigniter, timezone_menu и date_default_timezone_set"

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

 // 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 отмечен как истинный, например, 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 

Вы можете получить смещение 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-offsets фактически сопоставляются с множеством разных часовых UP1 , например 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 вообще, потому что отображение не является однозначным.

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

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