Я использую Codeigniters timezone_menu
который дает выпадающее поле временных часовых поясов, и мне интересно, как мы должны использовать эти часовые пояса с PHPs date_default_timezone_set
?
Примером часового пояса UP1
является UP1
. Однако вы не можете использовать это с PHPs date_default_timezone_set
поскольку строка, в которой она требуется, должна быть чем-то вроде Europe/Berlin
Вопрос в том, есть ли способ конвертировать строку часового пояса codeigniter в PHP, которая может быть принята 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