2 require_once 'Pman.php';
4 class Pman_Core_TimeZone extends Pman
10 if (!$this->getAuthUser()) {
11 $this->jerr("Not authenticated", array('authFailure' => true));
17 function get($base, $opts=array())
23 foreach(self::$timezones as $tz => $o) {
24 if(!empty($_REQUEST['region']) && $_REQUEST['region'] != $o['region']) {
29 !empty($_REQUEST['query']['area_start'])
31 substr(strtolower($o['area']), 0, strlen($_REQUEST['query']['area_start'])) != strtolower($_REQUEST['query']['area_start'])
36 'region' => $o['region'],
38 'displayArea' => $o['displayArea']
42 echo json_encode(array(
46 'successProperty' => 'success',
47 'totalProperty' => 'total',
55 'total' => count($data),
61 function post($base) {
65 static $timezones = array();
67 static function getTimezones()
69 if(!empty(self::$timezones)) {
70 return self::$timezones;
72 $ce = DB_DataObject::factory('core_enum');
75 *, TIME_FORMAT(TIMEDIFF(NOW(), CONVERT_TZ(NOW(), Name, 'UTC')), '%H:%i') as timeOffset
83 Name NOT LIKE 'right%'
85 Name NOT LIKE 'posix%'
89 SUBSTRING_INDEX(Name, '/', 1) ASC,
95 // ignroe timezone such as 'CET' and 'America/Argentina/Buenos_Aires'
98 $ar = explode('/', $ce->Name);
99 // ignore timezone such as 'Etc/GMT+8'
102 $displayArea = str_replace('_', ' ', $ar[1]);
104 $timeOffset = ((substr($ce->timeOffset, 0, 1) == '-') ? '' : '+') . $ce->timeOffset;
105 $displayOffset = '(GMT ' . $timeOffset . ')';
107 self::$timezones[$ce->Name] = array(
110 'displayName' => $ar[0] . '/' . $displayArea . ' ' . $displayOffset,
111 'displayArea' => $displayArea . ' ' . $displayOffset
115 return self::$timezones;
118 static function isValidTimeZone($tz) {
120 new DateTimeZone($tz);
122 catch (Exception $e) {
129 static function toRegion($tz)
131 if(!self::isValidTimeZone($tz)) {
135 return explode('/', $tz)[0];
138 static function toArea($tz)
140 if(!self::isValidTimeZone($tz)) {
144 return explode('/', $tz)[1];
147 static function toTimeOffset($dt, $tz)
149 if(!self::isValidTimeZone($tz)) {
153 if($dt == '0000-00-00 00:00:00' || $dt == '') {
157 $date = new DateTime($dt, new DateTimeZone($tz));
158 return $date->format('P');
161 static function toDisplayArea($dt, $tz)
163 return str_replace('_', ' ', self::toArea($tz)) . ' (GMT ' . self::toTimeOffset($dt,$tz) . ')';
167 static function toDisplayName($dt, $tz)
169 return self::toRegion($tz) . '/' . self::toDisplayArea($dt, $tz);