Я ищу способ создания списка часовых поясов для отображения в <select>
Создание выпадающего списка часовых поясов с PHP
$list = DateTimeZone::listAbbreviations();
$idents = DateTimeZone::listIdentifiers();
$data = $offset = $added = array();
foreach ($list as $abbr => $info) {
foreach ($info as $zone) {
if ( ! empty($zone['timezone_id'])
AND
! in_array($zone['timezone_id'], $added)
AND
in_array($zone['timezone_id'], $idents)) {
$z = new DateTimeZone($zone['timezone_id']);
$c = new DateTime(null, $z);
$zone['time'] = $c->format('H:i a');
$data[] = $zone;
$offset[] = $z->getOffset($c);
$added[] = $zone['timezone_id'];
}
}
}
array_multisort($offset, SORT_ASC, $data);
$options = array();
foreach ($data as $key => $row) {
$options[$row['timezone_id']] = $row['time'] . ' - '
. formatOffset($row['offset'])
. ' ' . $row['timezone_id'];
}
// now you can use $options;
function formatOffset($offset) {
$hours = $offset / 3600;
$remainder = $offset % 3600;
$sign = $hours > 0 ? '+' : '-';
$hour = (int) abs($hours);
$minutes = (int) abs($remainder / 60);
if ($hour == 0 AND $minutes == 0) {
$sign = ' ';
}
return 'GMT' . $sign . str_pad($hour, 2, '0', STR_PAD_LEFT)
.':'. str_pad($minutes,2, '0');
}
Когда я проверил свою страну, смещение было неправильным, я в Азии/Сингапуре, это должно быть UTC/GMT +8 http://www.timeanddate.com/worldclock/city.html?n=236 но в соответствии с сгенерированным списком его +9. Есть ли какая-то логическая ошибка? Время было правильным.
Есть ли лучший способ создать этот список? из того же вопроса в ссылке выше,
static $regions = array(
'Africa' => DateTimeZone::AFRICA,
'America' => DateTimeZone::AMERICA,
'Antarctica' => DateTimeZone::ANTARCTICA,
'Aisa' => DateTimeZone::ASIA,
'Atlantic' => DateTimeZone::ATLANTIC,
'Europe' => DateTimeZone::EUROPE,
'Indian' => DateTimeZone::INDIAN,
'Pacific' => DateTimeZone::PACIFIC
);
foreach ($regions as $name => $mask) {
$tzlist[] = DateTimeZone::listIdentifiers($mask);
}
Это просто получает идентификаторы, в которых я хочу приветственное отображаемое имя, например. UTC + 8 Азия/Сингапур или что-то подобное. Как я могу это получить?