I am looking for a way to generate a list of timezones for display in a <select>
Generating a drop down list of timezones with 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');}
When I checked my country, the offset was wrong, I am in Asia/Singapore, it should be UTC/GMT +8 http://www.timeanddate.com/worldclock/city.html?n=236 but according to the generated list its +9. Is there some kind of logic error? The time was correct tho
Is there a better way to generate this list? from the same question in the link above,
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);}
This just gets the identifiers I want a friendly display name eg. UTC+8 Asia/Singapore or something similar. How can I get that?